ديكت معكوس في بيثون
-
05-07-2019 - |
سؤال
وأنا أحاول أن إنشاء ديكت جديد باستخدام قائمة القيم من ديكت القائمة، مفاتيح الفردية.
وهكذا على سبيل المثال:
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()]