سؤال

هذا هو حقا من السهل فقط شرح مع مثال لذلك لإزالة تقاطع قائمة من داخل ديكت وعادة ما تفعل شيئا من هذا القبيل:

a = {1:'', 2:'', 3:'', 4:''}
exclusion = [3, 4, 5]

# have to build up a new list or the iteration breaks
toRemove = []
for var in a.iterkeys():
    if var in exclusion:
        toRemove.append(var)

for var in toRemove:
    del a[var]

هذا قد يبدو غير عادي سبيل المثال, لكنه يفاجئ عدد المرات التي اضطررت أن أفعل شيئا مثل هذا.تفعل هذا مع مجموعات سيكون أجمل بكثير ، ولكن من الواضح أنني أريد الإبقاء على "القيم" على dict.

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

هل كانت مفيدة؟

المحلول

النظر في dict.البوب:

for key in exclusion:
     a.pop(key, None)

على None يبقى البوب من رفع استثناء عندما key أليس مفتاح.

نصائح أخرى

a = dict((key,value) for (key,value) in a.iteritems() if key not in exclusion)

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

هل يمكن تغيير قائمة الاستبعاد لمجموعة، ثم مجرد استخدام تقاطع للحصول على التداخل.

exclusion = set([3, 4, 5])

for key in exclusion.intersection(a):
    del a[key]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top