简体   繁体   中英

is it possible to reverse a dictionary in python using dictionary comprehension

I want to reverse dictionary key, value pairs using a dictionary comprehension, but if the new dictionary has more than one value for a key then it is getting replaced with the last value.

Is it possible to append to the values in the new dictionary if a key is repeated, using a comprehension?

Input:

test_di = {'a':'1', 'b':'2', 'c':'3', 'd':'2'}

Code:

{v:k for k,v in test_di.items()} 

Output of this code:

{'1': 'a', '3': 'c', '2': 'd'}

Desired output:

{'1': ['a'], '3': ['c'], '2': ['b','d']}

It's not possible to do it in a reasonable way (ie O(N) time) with a dictionary comprehension. The comprehension simply can't handle duplicated values.

However, it's quite easy with a regular loop:

d = {}
for key, value in old_d.items():
    d.setdefault(value, []).append(key)

A defaultdict would be the most efficient approach:

from collections import defaultdict

test_di = {'a':'1', 'b':'2', 'c':'3', 'd':'2'}

d = defaultdict(list)
for v,k in test_di.items():
    d[k].append(v)

print(d)

Your question is confusing, but it sounds like you want to store multiple values at a single key in a dictionary.

This is not possible, you may want to look at storing a dictionary of lists.

You can use an OrderedDict and reverse the keys. A normal dict does not keep track of the order of the keys.

from collections import OrderedDict

dict1 = OrderedDict([('Name', 'Jon'), ('Race', 'Latino'), ('Job', 'Nurse')])
reversed_dict1 = OrderedDict([(key, dict1.get(key)) for key in reversed(dict1)])

Yes , it is possible (but it's not the most efficient solution):

d = {'a':'1', 'b':'2', 'c':'3', 'd':'2'}

{v1: [k1 for k1, v2 in d.items() if v1 == v2] for v1 in d.values()}
# {'1': ['a'], '2': ['b', 'd'], '3': ['c']}

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