How to write two else condition in dict comprehension

Viewed 359

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

5 Answers

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']}

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']}
>>> 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]}

Related