Ronen Badalov
Ronen Badalov

Reputation: 49

add a second value to a key (dict) python

I need to make sure I don't have more than one of the same keys, if so, leave the first one and add their value (make it a list) to the existing key this is what I tried:

my_dict = {1: "A", 2: "B", 1: "C"}
new_dict={}
list_keys = list(my_dict.keys())
list_values = list(my_dict.values())
for i in range(len(list_values)):
    if list_keys[i] in new_dict.keys():
        new_dict[list_keys[i]].append(list(list_values[i]))
    else:
        new_dict.update({list_keys[i]: list_values[i]})
return new_dict

The result required:

{1: ["A", "C"], 2: ["B"]}

Upvotes: 1

Views: 1219

Answers (3)

Buckeye14Guy
Buckeye14Guy

Reputation: 851

Using comprehensions if you want

a =  {"A":1, "B":2, "C":1}
{value:  [item_[0] for item_ in a.items() if item_[1] == value] for value in set(a.values())}

Output

{1: ['A', 'C'], 2: ['B']}

Upvotes: 0

user2390182
user2390182

Reputation: 73450

The most concise way of reversing a dict like that uses a defaultdict:

from collections import defaultdict

d = {"A": 1, "B": 2, "C": 1}

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

rev
# defaultdict(<class 'list'>, {1: ['A', 'C'], 2: ['B']})

Upvotes: 2

Engineero
Engineero

Reputation: 12908

That first line doesn't make sense. A dictionary cannot have two values for the same key, so when you run that first line, the resulting dictionary is:

my_dict = {1: 'A', 2: 'B', 1: 'C'}
print(my_dict)
# {1: 'C', 2: 'B'}

What you could do is iterate over lists of desired keys and values, and build the dictionary that you want that way:

my_keys = [1, 2, 1]
my_vals = ['A', 'B', 'C']
my_dict = {}
for k, v in zip(my_keys, my_vals):
    if k in my_dict.keys():
        if not isinstance(my_dict[k], list):
            my_dict[k] = [my_dict[k]]  # convert to a list
        my_dict[k].append(v)
    else:
        my_dict[k] = v
print(my_dict)
# {1: ['A', 'C'], 2: 'B'}

Based on the comments, you originally had a dictionary in_dict = {'A': 1, 'B': 2, 'C':1}. Given this in_dict, you can get the desired result by setting my_keys = in_dict.values() and my_vals = in_dict.keys() in the code above.

Upvotes: 0

Related Questions