create - python for loop




إضافة مفاتيح جديدة لقاموس؟ (9)

"هل من الممكن إضافة مفتاح إلى قاموس Python بعد إنشائه؟ يبدو أنه لا يحتوي على أسلوب .add ()."

نعم ، هذا ممكن ، ولديه طريقة تقوم بتنفيذ هذا ، لكنك لا تريد استخدامه مباشرة.

لإثبات كيفية استخدام هذه الطريقة وكيفية استخدامها ، دعنا ننشئ أسلوبًا فارغًا مع الحرف dict ، {} :

my_dict = {}

أفضل ممارسة 1: تدوين نص برمجي

لتحديث هذا الأمر باستخدام مفتاح وقيمة واحدة ، يمكنك استخدام ترميز منخفض (انظر التعيينات هنا) الذي يوفر تعيين العنصر:

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

my_dict الآن:

{'new key': 'new value'}

أفضل ممارسة 2: طريقة update - 2 طرق

يمكننا أيضًا تحديث الأمر مع قيم متعددة بكفاءة أيضًا باستخدام طريقة update . قد نشكل دون داع طريقا إضافيا هنا ، لذلك نأمل أن يكون قد تم بالفعل إنشاء هدفنا أو أن يكون قد تم استخدامه لغرض آخر:

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

my_dict الآن:

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

هناك طريقة أخرى فعالة للقيام بذلك باستخدام طريقة التحديث مع وسيطات الكلمات الرئيسية ، ولكن بما أنه يجب أن تكون كلمات python شرعية ، فلا يمكن أن يكون لديك مسافات أو رموز خاصة أو تبدأ الاسم برقم ، ولكن العديد يعتبر أن هذه الطريقة أكثر قابلية للقراءة لإنشاء مفاتيح ل dict ، وهنا نتجنب بالتأكيد إنشاء dict إضافية غير ضرورية:

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

و my_dict الآن:

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

حتى الآن قمنا بتغطية ثلاثة طرق Pythonic من تحديث dict .

الطريقة السحرية ، __setitem__ ، ولماذا يجب تجنبها

هناك طريقة أخرى لتحديث أمر يجب عدم استخدامه ، والذي يستخدم طريقة __setitem__ . في ما يلي مثال على الكيفية التي يمكن بها استخدام طريقة __setitem__ لإضافة زوج من قيم المفاتيح إلى نظام توضيحي ، وإجراء عرض توضيحي للأداء الضعيف لاستخدامه:

>>> 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

لذلك نرى أن استخدام تدوين __setitem__ هو في الواقع أسرع بكثير من استخدام __setitem__ . إن القيام بالشيء الأثري ، أي استخدام اللغة بالطريقة التي كان من المعتزم استخدامها ، عادة ما يكون أكثر قابلية للقراءة والكفاءة الحسابية.

هل من الممكن إضافة مفتاح إلى قاموس Python بعد إنشائه؟ يبدو أنه لا يحتوي على أسلوب .add() .


أشعر بدمج المعلومات حول قواميس Python:

إنشاء قاموس فارغ

data = {}
# OR
data = dict()

إنشاء قاموس بالقيم الأولية

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))}

إدخال / تحديث قيمة واحدة

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)

إدخال / تحديث قيم متعددة

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

إنشاء قاموس مدمج دون تعديل النسخ الأصلية

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

حذف العناصر في القاموس

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

تحقق من وجود مفتاح بالفعل في القاموس

key in data

تكرّر من خلال أزواج في قاموس

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

قم بإنشاء قاموس من قائمتين

data = dict(zip(list_with_keys, list_with_values))

انت حر لتضيف المزيد!


إذا لم تنضم إلى قواميسين ، ولكنك تضيف أزواجًا جديدة من قيم المفتاح إلى القاموس ، فإن استخدام الترميز المكتوب يبدو أفضل طريقة.

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

ومع ذلك ، إذا كنت ترغب في إضافة ، على سبيل المثال ، الآلاف من أزواج القيم الأساسية الجديدة ، يجب أن تفكر في استخدام طريقة update() .


الكثير من الأجوبة وما زال الجميع نسيًا عن الغريب المسمى ، الغريب في التصرف ، ومع ذلك لا يزال مفيدًا dict.setdefault()

هذه

value = my_dict.setdefault(key, default)

في الأساس يفعل هذا فقط:

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

على سبيل المثال

>>> 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

دعنا نتظاهر أنك تريد أن تعيش في العالم غير القابل للتغيير ولا ترغب في تعديل النسخة الأصلية ولكنك تريد إنشاء طريقة جديدة هي نتيجة إضافة مفتاح جديد إلى الأصل.

في Python 3.5+ يمكنك القيام بما يلي:

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

معادلة بايثون 2 هي:

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

بعد أي من هذين:

params لا يزال يساوي {'a': 1, 'b': 2}

و

new_params يساوي {'a': 1, 'b': 2, 'c': 3}

ستكون هناك أوقات لا تريد فيها تعديل النسخة الأصلية (فأنت تريد فقط نتيجة الإضافة إلى النص الأصلي). أجد هذا بديل منعش لما يلي:

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

أو

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

المرجع: https://.com/a/2255892/514866


نعم ، الأمر سهل جدًا. فقط قم بما يلي:

dict["key"] = "value"

يمكنك إنشاء واحد

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)

يعطي

>>> 
{'apples': 6, 'bananas': 3}

>>> d = {'key':'value'}
>>> print(d)
{'key': 'value'}
>>> d['mynewkey'] = 'mynewvalue'
>>> print(d)
{'mynewkey': 'mynewvalue', 'key': 'value'}

dictionary[key] = value




dictionary