13 Soru: Sözlüğe yeni anahtarlar eklensin mi?

tarafından oluşturulan soru Fri, May 3, 2019 12:00 AM

Oluşturulduktan sonra Python sözlüğüne bir anahtar eklemek mümkün müdür? .add() yöntemine sahip görünmüyor.

    
2293
  1. Burada bir anahtarını nasıl ekleyeceğinizi bulmaya çalışıyorsanız ve yeni bir sözlüğünü döndürürseniz, Bunu python3.5 +: {**mydict, 'new_key': new_val}'da yapın.
    2018-12-19 13: 17: 10Z
13 Yanıtlar                              13                         
 
d = {'key':'value'}
print(d)
# {'key': 'value'}
d['mynewkey'] = 'mynewvalue'
print(d)
# {'mynewkey': 'mynewvalue', 'key': 'value'}
    
3009
2019-01-04 13: 44: 21Z
  1. Açıklama: Bu tuşa bir değer atayarak, sözlükte yeni bir anahtar \değer çifti oluşturursunuz. Anahtar yoksa, eklenir ve bu değeri gösterir. Varsa, gösterdiği mevcut değerin üzerine yazılır.
    2018-05-31 01: 22: 07Z
  2. Bu ve .update() yöntemi arasındaki fark nedir? Hangisi daha iyi?
    2019-01-16 19: 14: 17Z
  3. @ d[key]=val sözdizimini kısalttığından ve herhangi bir nesneyi anahtar olarak işleyebildiği (yıkanabilir olduğu sürece) ve yalnızca bir değer atarken, .update(key1=val1, key2=val2) daha iyi olur Aynı anda birden fazla değer ayarlamak istiyorsanız, tuşlar dizel olduğu sürece (kwargs dizgilere dönüştürüldüğü için). dict.update başka bir sözlük alabilir, ancak kişisel olarak bir başkasını güncellemek için açıkça yeni bir sözlük oluşturmamayı tercih ederim.
    2019-02-13 08: 38: 56Z

Aynı anda birden fazla anahtar eklemek için:

 
>>> x = {1:2}
>>> print x
{1: 2}

>>> d = {3:4, 5:6, 7:8}
>>> x.update(d)
>>> print x
{1: 2, 3: 4, 5: 6, 7: 8}

Tek bir anahtar eklemek için, kabul edilen yanıtın daha az hesaplama ek yükü vardır.

    
947
2019-04-26 19: 47: 22Z
  1. bu sadece bir anahtar güncellemek için bir sözlük oluşturmak için yetersiz. Bunu sadece 1'den fazla anahtarınız varsa yapın (üzerinde dikt oluşturmanın daha iyi olduğu bir eşik olabilir)
    2018-08-01 21: 42: 49Z
  2. @ Jean-FrançoisFabre Bu örnek koddur. Cevapları tüm vakaları kapsayan gibi görmemelisin.
    2019-03-27 05: 59: 04Z
  3. , bir anahtar eklemenin tercih edilen yol olduğu yanlış izlenimini veriyor.
    2019-03-27 06: 14: 36Z

Python sözlükleriyle ilgili bilgileri birleştirmek istiyorum:

Boş bir sözlük oluşturma

 
data = {}
# OR
data = dict()

Başlangıç ​​değerlerine sahip bir sözlük oluşturma

 
data = {'a':1,'b':2,'c':3}
# OR
data = dict(a=1, b=2, c=3)
# OR
data = {k: v for k, v in (('a', 1),('b',2),('c',3))}

Tek bir değer ekleme /güncelleme

 
data['a']=1  # Updates if 'a' exists, else adds 'a'
# OR
data.update({'a':1})
# OR
data.update(dict(a=1))
# OR
data.update(a=1)

Birden çok değer ekleme /güncelleme

 
data.update({'c':3,'d':4})  # Updates 'c' and adds 'd'

Orijinalleri değiştirmeden birleştirilmiş bir sözlük oluşturma

 
data3 = {}
data3.update(data)  # Modifies data3, not data
data3.update(data2)  # Modifies data3, not data2

Sözlükteki öğeleri silme

 
del data[key]  # Removes specific element in a dictionary
data.pop(key)  # Removes the key & returns the value
data.clear()  # Clears entire dictionary

Bir anahtarın zaten sözlükte olup olmadığını kontrol edin

 
key in data

Sözlükteki çiftler arasında yineleme

 
for key in data: # Iterates just through the keys, ignoring the values
for key, value in d.items(): # Iterates through the pairs
for key in d.keys(): # Iterates just through key, ignoring the values
for value in d.values(): # Iterates just through value, ignoring the keys

2 listeden bir sözlük oluşturun

 
data = dict(zip(list_with_keys, list_with_values))

Daha fazla eklemek için çekinmeyin!

    
800
2018-05-11 19: 28: 30Z
  1. python 3.5'ten ayrıca şu şekilde birleştirilmiş bir sözlük de oluşturabilirsiniz: data3 = {**data1, **data2}.
    2019-02-12 10: 41: 43Z
  

"Oluşturulduktan sonra Python sözlüğüne bir anahtar eklemek mümkün mü? Bir .add () yöntemi yok gibi görünüyor."

Evet mümkündür ve bunu uygulayan bir yöntemi vardır, ancak doğrudan kullanmak istemezsiniz.

Nasıl ve nasıl kullanmayacağınızı göstermek için, {} numaralı dikt ile boş bir dit oluşturalım:

 
my_dict = {}

En İyi Uygulama 1: Abonelik notasyonu

Bu dikteyi tek bir yeni anahtar ve değerle güncellemek için öğe atamasını sağlayan alt simge gösterimi (buradaki Haritalamalar'a bakın) :  

my_dict['new key'] = 'new value'

my_dict şuan:

 
{'new key': 'new value'}

En İyi Uygulama 2: update yöntemi - 2 yöntem

Ayrıca, update yöntemini kullanarak . Gereksiz yere fazladan bir dict oluşturuyor olabiliriz, bu nedenle dict'umuzun daha önce oluşturulduğunu ve geldiğini veya başka bir amaç için kullanıldığını umuyoruz:

 
my_dict.update({'key 2': 'value 2', 'key 3': 'value 3'})

my_dict şuan:

 
{'key 2': 'value 2', 'key 3': 'value 3', 'new key': 'new value'}

Bunu güncelleme yöntemiyle yapmanın bir başka etkili yolu anahtar kelime argümanlarıdır, ancak meşru python kelimeler olması gerektiğinden, boşluklara veya özel sembollere sahip olamazsınız veya adı bir numara ile başlatamazsınız, ancak çoğu bunu bir Bir dict için anahtar oluşturmanın daha okunaklı bir yolu ve burada kesinlikle gereksiz ekstra bir dict oluşturmaktan kaçınıyoruz:

 
my_dict.update(foo='bar', foo2='baz')

ve my_dict şimdi:

 
{'key 2': 'value 2', 'key 3': 'value 3', 'new key': 'new value', 
 'foo': 'bar', 'foo2': 'baz'}

Şimdi bir dict'u güncellemenin üç Pythonic yolunu ele aldık.


Sihirli yöntem, __setitem__ ve neden kaçınılması gerektiğine

dict yöntemini kullanan, kullanmamanız gereken __setitem__ sürümünü güncellemenin başka bir yolu var. İşte __setitem__'a bir anahtar /değer çiftini eklemek için dict yöntemini nasıl kullanabileceğine ve bunun düşük performans gösterdiğine dair bir örnek:

 
>>> d = {}
>>> d.__setitem__('foo', 'bar')
>>> d
{'foo': 'bar'}


>>> def f():
...     d = {}
...     for i in xrange(100):
...         d['foo'] = i
... 
>>> def g():
...     d = {}
...     for i in xrange(100):
...         d.__setitem__('foo', i)
... 
>>> import timeit
>>> number = 100
>>> min(timeit.repeat(f, number=number))
0.0020880699157714844
>>> min(timeit.repeat(g, number=number))
0.005071878433227539

Öyleyse, alt simge gösterimini kullanmanın aslında __setitem__ kullanmaktan çok daha hızlı olduğunu görüyoruz. Pythonic şeyini yapmak, yani dili, kullanılması amaçlanan şekilde kullanmak, genellikle hem daha okunaklı hem de hesaplama açısından verimlidir.

    
127
2016-06-17 11: 28: 41Z
 
dictionary[key] = value
    
82
2009-06-21 22: 08: 57Z

Bir sözlük içinde bir sözlük eklemek istiyorsanız, bunu bu şekilde yapabilirsiniz.

Örnek: Sözlüğünüze yeni bir giriş ekleyin & alt sözlük

 
dictionary = {}
dictionary["new key"] = "some new entry" # add new dictionary entry
dictionary["dictionary_within_a_dictionary"] = {} # this is required by python
dictionary["dictionary_within_a_dictionary"]["sub_dict"] = {"other" : "dictionary"}
print (dictionary)

Sonuç:

 
{'new key': 'some new entry', 'dictionary_within_a_dictionary': {'sub_dict': {'other': 'dictionarly'}}}

NOT: Python, önce bir alt eklemenizi gerektirir

 
dictionary["dictionary_within_a_dictionary"] = {}

girişleri eklemeden önce.

    
51
2017-11-10 20: 38: 16Z
  1. bu, php.net kılavuz sayfalarındaki yorumların çoğu gibi sorulan soru ile ilgisi yoktur ...
    2012-06-01 21: 05: 40Z
  2. Bunu bir satırda yapmayı durduracak bir şey yok: dictionary = {"dictionary_within_a_dictionary": {"sub_dict": {"other" : "dictionary"}}} (veya dictionary zaten bir dict ise, dictionary["dictionary_within_a_dictionary"] = {"sub_dict": {"other" : "dictionary"}})
    2017-12-27 16: 07: 22Z

Ortodoks sözdizimi d[key] = value'dur, ancak klavyeniz köşeli parantez tuşlarını eksikse, yapabilecekleriniz:

 
d.__setitem__(key, value)

Aslında, __getitem__ ve __setitem__ yöntemlerini tanımlamak kendi sınıfınızı köşeli parantez sözdizimini nasıl destekleyebileceğinizdir. https://python.developpez.com/cours/DiveIntoPython/php/endiveintopython/object_oriented_framework/spp/endiveintopython/object_oriented_framework/special_class_methods.tr     

36
2019-06-02 09: 01: 03Z
  1. Klavyemdeki parantez tuşları olmadan python ile programlamayı çok zor buluyorum.
    2016-10-27 14: 10: 02Z
  2. Veya dizilerle ilgilenirken çoğu programlama dili ...
    2017-12-08 03: 33: 31Z
  3. Bu, liste değerini anlamada sözlük değerlerini bulmamın tek yoluydu. Teşekkür
    2018-05-18 13: 29: 31Z
  4. @ chrisstevens, kullandığım bir hack değerini anlamada kullanmak istiyorsanız [a for a in my_dict if my_dict.update({'a': 1}) is None].
    2018-09-13 22: 45: 39Z

bir tane oluşturabilirsiniz

 
class myDict(dict):

    def __init__(self):
        self = dict()

    def add(self, key, value):
        self[key] = value

## example

myd = myDict()
myd.add('apples',6)
myd.add('bananas',3)
print(myd)

verir

 
>>> 
{'apples': 6, 'bananas': 3}
    
30
2013-05-25 13: 33: 35Z

Bu popüler soru a ve b sözlüklerini birleştirme yöntemlerini işlevsel adresler.

İşte daha basit yöntemlerden bazıları (Python 3'te test edilmiştir) ...

 
c = dict( a, **b ) ## see also https://stackoverflow.com/q/2255878
c = dict( list(a.items()) + list(b.items()) )
c = dict( i for d in [a,b] for i in d.items() )

Not: Yukarıdaki ilk yöntem yalnızca b’daki anahtarların dizeleriyse çalışır.

Tek bir öğe eklemek veya değiştirmek için , b sözlüğü yalnızca o öğeyi içerir ...

 
c = dict( a, **{'d':'dog'} ) ## returns a dictionary based on 'a'

Bu şuna eşittir ...

 
def functional_dict_add( dictionary, key, value ):
   temp = dictionary.copy()
   temp[key] = value
   return temp

c = functional_dict_add( a, 'd', 'dog' )
    
30
2017-05-23 11: 55: 01Z
  1. Python BDFL'den ilk yöntem hakkında ilginç yorum ( burada ).
    2013-08-17 23: 09: 03Z

Değişmez dünyada yaşamak istediğinizi ve orijinali değiştirmek istemediğinizi ama orijinaline yeni bir anahtar eklemenin bir sonucu olan dict oluşturmak istediğinizi farz edelim.

Python 3.5+ sürümünde şunları yapabilirsiniz:

 
params = {'a': 1, 'b': 2}
new_params = {**params, **{'c': 3}}

Python 2 eşdeğeri:

 
params = {'a': 1, 'b': 2}
new_params = dict(params, **{'c': 3})

Şunlardan sonra:

params hala {'a': 1, 'b': 2}’a eşittir

ve

new_params, {'a': 1, 'b': 2, 'c': 3}’a eşittir

Orijinali değiştirmek istemediğiniz zamanlar olacaktır (yalnızca orijinali eklemenin sonucunu istiyorsunuz). Bunu, aşağıdakine yenileyici bir alternatif buluyorum:

 
params = {'a': 1, 'b': 2}
new_params = params.copy()
new_params['c'] = 3

veya

 
params = {'a': 1, 'b': 2}
new_params = params.copy()
new_params.update({'c': 3})

Referans: https://stackoverflow.com/a/2255892/514866

    
18
2018-01-12 19: 31: 53Z
  1. İşlevsel bir programlama meslektaşıma olan uzun bir konuşmada benim için iyi bir nokta ortaya çıktı. Yukarıdaki yaklaşımın bir dezavantajı, kodu okuyan birisinin Python'daki ** ile aşina olmaması durumunda (çoğu değil) o zaman ne olduğu belli olmayacaktır. Daha iyi okunabilirlik için daha az işlevsel bir yaklaşımı tercih edeceğiniz zamanlar olabilir.
    2018-01-30 17: 05: 21Z
  2. Okuyucularımızın Python dilinin hangi alt kümesini bildiğini tahmin edemiyoruz, bu nedenle, tüm dili bildiklerini ve böylece dokümanlar üzerinde aramadıkları parçaları aradıklarını varsaymak adil olur. >
    2018-03-07 20: 56: 41Z

    Çok fazla cevap ve hala herkes garip bir şekilde adlandırılmış, garip davranmış ve yine de kullanışlı dict.setdefault()'u unuttu

     
    value = my_dict.setdefault(key, default)
    

    temel olarak şunu yapar:

     
    try:
        value = my_dict[key]
    except KeyError: # key not found
        value = my_dict[key] = default
    

    örn.

     
    >>> mydict = {'a':1, 'b':2, 'c':3}
    >>> mydict.setdefault('d', 4)
    4 # returns new value at mydict['d']
    >>> print(mydict)
    {'a':1, 'b':2, 'c':3, 'd':4} # a new key/value pair was indeed added
    # but see what happens when trying it on an existing key...
    >>> mydict.setdefault('a', 111)
    1 # old value was returned
    >>> print(mydict)
    {'a':1, 'b':2, 'c':3, 'd':4} # existing key was ignored
    
        
    12
    2017-10-23 14: 03: 24Z

    İki sözlüğe katılmıyorsanız, ancak bir sözlüğe yeni anahtar-değer çiftleri ekliyorsanız, alt simge gösterimini kullanmak en iyi yol gibi görünür.

     
    import timeit
    
    timeit.timeit('dictionary = {"karga": 1, "darga": 2}; dictionary.update({"aaa": 123123, "asd": 233})')
    >> 0.49582505226135254
    
    timeit.timeit('dictionary = {"karga": 1, "darga": 2}; dictionary["aaa"] = 123123; dictionary["asd"] = 233;')
    >> 0.20782899856567383
    

    Ancak, örneğin, binlerce yeni anahtar /değer çifti eklemek isterseniz, update() yöntemini kullanmayı düşünmelisiniz.

        
    3
    2018-10-11 09: 03: 32Z

    ilk önce anahtarın var olup olmadığını kontrol etmek için

     
    a={1:2,3:4}
    a.get(1)
    2
    a.get(5)
    None
    

    sonra yeni anahtarı ve değeri ekleyebilirsiniz

        
    0
    2019-03-25 13: 01: 25Z
kaynak yerleştirildi İşte