create - python for loop




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

أردت اختبار ما إذا كان هناك مفتاح موجود في القاموس قبل تحديث قيمة المفتاح. كتبت التعليمة البرمجية التالية:

if 'key1' in dict.keys():
  print "blah"
else:
  print "boo"

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


أستخدم المحاولة / باستثناء ؛ إذا تم طرح استثناء ، فإن المفتاح غير موجود في القاموس. مثال:

st = 'sdhfjaks'
d = {}
try:
    print d['st']
except Exception, e:
    print 'Key not in the dictionary'

أسهل واحد هو معرفة أي مفتاح (اسم المفتاح) هو البحث عن:

# suppose your dictionary is
my_dict = {'foo': 1, 'bar': 2}
# check if a key is there
if 'key' in my_dict.keys():   # it will evaluates to true if that key is present otherwise false.
    # do something

أو يمكنك أيضًا ببساطة ما يلي:

if 'key' in my_dict:   # it will evaluates to true if that key is present otherwise false.
    # do something

القاموس في بيثون لديه طريقة ("مفتاح" ، الافتراضي). لذا يمكنك فقط تعيين قيمة افتراضية في حالة عدم وجود مفتاح.

values = {...}
myValue = values.get('Key', None)

باستخدام المشغل الثلاثي:

message = "blah" if 'key1' in dict else "booh"
print(message)

قاموس بايثون لديه طريقة تسمى __contains__ . سيعود هذا الأسلوب True إذا كان القاموس يحتوي على المفتاح الآخر بإرجاع False.

 >>> temp = {}

 >>> help(temp.__contains__)

Help on built-in function __contains__:

__contains__(key, /) method of builtins.dict instance
    True if D has a key k, else False.

للتحقق يمكنك استخدام أسلوب has_key()

if dict.has_key('key1'):
   print "it is there"

إذا كنت تريد قيمة ، فيمكنك استخدام أسلوب get()

a = dict.get('key1', expeced_type)

إذا كنت تريد مجموعة أو قائمة أو قاموس أو أي سلسلة كقيمة افتراضية كقيمة للإرجاع ، فاستخدم طريقة get()

a = dict.get('key1', {}).get('key2', [])

لماذا لا تستخدم فقط أسلوب has_key ().

a = {}
a.has_key('b') => #False

a['b'] = 8
a.has_key('b') => #True

ليس عليك استدعاء مفاتيح:

if 'key1' in dict:
  print "blah"
else:
  print "boo"

سيكون ذلك faster بكثير لأنه يستخدم تجزئة القاموس بدلاً من إجراء بحث خطي ، والذي ستفعله مفاتيح الاتصال.


مجرد FYI مضيفا لكريس. ب (أفضل إجابة):

d = defaultdict(int)

يعمل كذلك. السبب أن استدعاء int() إرجاع 0 وهو ما يفعله defaultdict خلف الكواليس (عند إنشاء قاموس) ، لذلك الاسم "Function Factory" في الوثائق.


يمكنك اختبار وجود مفتاح في القاموس ، باستخدام الكلمة الأساسية:

d = {'a': 1, 'b': 2}
'a' in d # <== evaluates to True
'c' in d # <== evaluates to False

يعد الاستخدام الشائع للتحقق من وجود مفتاح في القاموس قبل تحويره هو التهيئة الافتراضية للقيمة (على سبيل المثال إذا كانت قيمك هي قوائم ، على سبيل المثال ، وتريد التأكد من وجود قائمة فارغة يمكنك إلحاقها بها عند إدخال القيمة الأولى لمفتاح). في مثل هذه الحالات ، قد تجد أن نوع collections.defaultdict() يكون موضع اهتمام.

في التعليمات البرمجية القديمة ، قد تجد أيضًا بعض الاستخدامات لـ has_key() ، وهي طريقة تم إيقافها للتحقق من وجود المفاتيح في القواميس (فقط استخدم key_name in dict_name ، بدلاً من ذلك).


in هو الطريقة المقصودة لاختبار وجود مفتاح في dict .

d = dict()

for i in xrange(100):
    key = i % 10
    if key in d:
        d[key] += 1
    else:
        d[key] = 1

إذا كنت تريد افتراضيًا ، فيمكنك دائمًا استخدام dict.get() :

d = dict()

for i in xrange(100):
    key = i % 10
    d[key] = d.get(key, 0) + 1

... وإذا كنت تريد دائمًا ضمان قيمة افتراضية لأي مفتاح ، يمكنك استخدام defaultdict من وحدة collections ، مثل:

from collections import defaultdict

d = defaultdict(lambda: 0)

for i in xrange(100):
    d[i % 10] += 1

... ولكن بشكل عام ، الكلمة الرئيسية هي أفضل طريقة للقيام بذلك.


print dict.get('key1', 'blah')

لن تطبع boo للقيم الموجودة في الأمر ولكن تحقق الهدف من خلال طباعة قيمة key1 لتأكيد وجودها بدلاً من ذلك.


يمكنك استخدام أسلوب has_key ():

if dict.has_key('xyz')==1:
    #update the value for the key
else:
    pass

أو طريقة dict.get لتعيين قيمة افتراضية إذا لم يتم العثور عليها:

mydict = {"a": 5}

print mydict["a"]            #prints 5
print mydict["b"]            #Throws KeyError: 'b'

print mydict.get("a", 0)     #prints 5
print mydict.get("b", 0)     #prints 0




dictionary