简体   繁体   中英

How to write two else condition in dict comprehension

2 dictionary d1,d2, create a new dictionary with same keys.

d1 = {'product': '8', 'order': '8', 'tracking': '3'}
d2 = {'order': 1, 'product': 1,'customer':'5'}
dict3 = { k: [ d1[k], d2[k] ] if k in d2 else [d1[k]] for k in d1 }
dict3
{'product': ['8', 1], 'order': ['8', 1], 'tracking': ['3']}

How to pass else [d2[k]] for k in d2 to get the expected out

My Expected out

{'product': ['8', 1], 'order': ['8', 1], 'tracking': ['3'],'customer':['5']}

Disclaimer. I have done with defaultdict . Please give answer in dict comprehension only

You have to iterate over both the dictionaries to include all the keys in new constructed dict.

You can achieve this by using defaultdict

from collections import defaultdict
res = defaultdict(list)
for key, value in d1.items():
    res[key].append(value)

for key, value in d2.items():
    res[key].append(value)

Output:

>>> dict(res)
>>> {'product': ['8', 1], 'order': ['8', 1], 'tracking': ['3'], 'customer': ['5']}

Using a defaultdict without a comprehension is a much, much better way to go, but as requested:

d1 = {'product': '8', 'order': '8', 'tracking': '3'}
d2 = {'order': 1, 'product': 1,'customer':'5'}

d3 = {
    k: [d1[k], d2[k]]
    if (k in d1 and k in d2)
    else [d1[k]]
    if k in d1
    else [d2[k]]
    for k in list(d1.keys()) + list(d2.keys())
}

d3 is now:

{'product': ['8', 1], 'order': ['8', 1], 'tracking': ['3'], 'customer': ['5']}

You could use a nested ternary ... if... else (... if... else...) , but what if there are three dictionaries, or four? Better use a nested list comprehension and iterate over the different dictionaries.

>>> d1 = {'product': '8', 'order': '8', 'tracking': '3'}
>>> d2 = {'order': 1, 'product': 1,'customer':'5'}
>>> {k: [d[k] for d in (d1, d2) if k in d] for k in set(d1) | set(d2)}
{'customer': ['5'], 'order': ['8', 1], 'product': ['8', 1], 'tracking': ['3']}
>>> d1 = {'product': '8', 'order': '8', 'tracking': '3'}
>>> d2 = {'order': 1, 'product': 1, 'customer': '5'}

>>> dict3 = {k: [d1[k], d2[k]] if k in d1 and k in d2 else [d1[k]] if k in d1 else [d2[k]] for list in [d1, d2] for k in list}
>>> dict3
{'product': ['8', 1], 'order': ['8', 1], 'tracking': ['3'],'customer':['5']}
d1 = {'product': '8', 'order': '8', 'tracking': '3'}
d2 = {'order': 1, 'product': 1, 'customer': '5'}
list_ = []
for i in [d1, d2]:
    list_.append(i)

list_

[{'product': '8', 'order': '8', 'tracking': '3'}, {'order': 1, 'product': 1, 'customer': '5'}]

dict_={}
for d in list_:
    for k,v in d.items():
        dict_.setdefault(k,[]).append(v)
dict_

{'product': ['8', 1], 'order': ['8', 1], 'tracking': ['3'], 'customer': ['5']}

Comprehension

combined_key = {key for d in list_ for key in d}
combined_key

{'customer', 'order', 'product', 'tracking'}

super_dict = {key:[d[key] for d in list_ if key in d] for key in combined_key}
super_dict

{'customer': ['5'], 'tracking': ['3'], 'order': ['8', 1], 'product': ['8', 1]}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM