سؤال

وأنا أحاول أن إنشاء ديكت جديد باستخدام قائمة القيم من ديكت القائمة، مفاتيح الفردية.

وهكذا على سبيل المثال:

dict1 = dict({'a':[1,2,3], 'b':[1,2,3,4], 'c':[1,2]})

ووأود الحصول على:

dict2 = dict({1:['a','b','c'], 2:['a','b','c'], 3:['a','b'], 4:['b']})

وحتى الآن، لقد لم تكن قادرة على القيام بذلك بطريقة نظيفة جدا. أي اقتراحات؟

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

المحلول

إذا كنت تستخدم بايثون 2.5 أو أعلى، استخدم defaultdict فئة من collections حدة. وdefaultdict تلقائيا بإنشاء القيم في أول الوصول إلى المفتاح المفقود، لذلك يمكنك استخدام ذلك هنا لإنشاء قوائم للdict2، مثل هذا:

from collections import defaultdict
dict1 = dict({'a':[1,2,3], 'b':[1,2,3,4], 'c':[1,2]})
dict2 = defaultdict(list)
for key, values in dict1.items():
    for value in values:
        # The list for dict2[value] is created automatically
        dict2[value].append(key)

لاحظ أن القوائم في dict2 لن تكون في أي ترتيب معين، وذلك قواميس لا تأمر أزواج قيمة المفتاح الخاصة بهم.

إذا كنت ترغب في ديكت العاديين في نهاية التي من شأنها رفع KeyError لمفاتيح مفقودة، ومجرد استخدام dict2 = dict(dict2) بعد ما ورد أعلاه.

نصائح أخرى

لاحظ أنك لا تحتاج إلى dict في الأمثلة الخاص بك: بناء الجملة {} يعطيك ديكت:

dict1 = {'a':[1,2,3], 'b':[1,2,3,4], 'c':[1,2]}

وسيلة أخرى:

dict2={}
[[ (dict2.setdefault(i,[]) or 1) and (dict2[i].append(x)) for i in y ] for (x,y) in dict1.items()]  
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top