py_learner1
py_learner1

Reputation: 3

how can I merge lists to create a python dictionary

So I have tried many methods to do this but could not find a working solution. In this problem, I have two python arrays and I would like to join them to create a big dictionary. It would go something like this:

`list1 = [
[2, "ford"],
[4,"Ferrari"],
[3, "Mercedes"],
[1, "BMW"]
]`

`list2 = [
[4, "mustang"],
[3,"LaFerrari"],
[2,"CLA"],
[1,"M5"],
[6,"opel"]
]`

The result that I would like to have is a dictionary that looks like this:

`result = {
1: ["BMW","M5"], 2: ["Ford","CLA"], 3: ["Mercedes","LaFerrari"], 4: ["Ferrari","Mustang"], 6:["Opel"]
}`

So it just basically needs to merge these two arrays based on the "key" (which is just the [0] place in the array)

Upvotes: 0

Views: 62

Answers (5)

Hidden_NB
Hidden_NB

Reputation: 68

I am also pretty new to Python, but I think something like this should work if both lists have the same keys:

list1 = [
    [1, "ford"],
    [2, "Ferrari"],
    [3, "Mercedes"],
    [4, "BMW"]
]
list2 = [
    [1, "mustang"],
    [2, "LaFerrari"],
    [3, "CLA"],
    [4, "M5"]
]
dict1 = dict(list1)
dict2 = dict(list2)
result = {}
for key,val in dict1.items():
    result[key] = [val]
for key, val in dict2.items():
    result[key].append(val)
print(result)

output

{1: ['ford', 'mustang'], 2: ['Ferrari', 'LaFerrari'], 3: ['Mercedes', 'CLA'], 4: ['BMW', 'M5']}

As already mentioned, I am a newbie too, so there is probably a more "pythonic" way of doing this.

Upvotes: 1

awarrier99
awarrier99

Reputation: 3855

First, create a dict using the values in list1. Then update the lists in the dict with the values from list2, or create new lists for the keys in list2 which don't exist in list1:

result = {i: [j] for i, j in list1} # create initial dict from all values in list1
for i, j in list2:
    if i in result:
        result[i].append(j) # add to preexisting list corresponding to key
    else:
        result[i] = [j] # create new list corresponding to key

If your lists will have multiple values, you can use this where you handle the add logic in a separate function:

result = {}
def add_to_dict(d, key, val):
    if key in d:
        d[key].append(val)
    else:
        d[key] = [val]

for el in (list1 + list2):
    key, *vals = el
    for val in vals:
        add_to_dict(result, key, val)

Here, rather than assuming each sublist has only 2 elements, we can unpack the key as the first element and the rest of the elements into a list called vals. Then, we can iterate over the list and perform the same adding logic

Upvotes: 0

Transhuman
Transhuman

Reputation: 3547

Use collections.defaultdict

from collections import defaultdict

result = defaultdict(list)
for k,v in list1 + list2:
    result[k].append(v)

print (dict(result))
#{2: ['ford', 'CLA'], 4: ['Ferrari', 'mustang'], 3: ['Mercedes', 'LaFerrari'], 1: ['BMW', 'M5'], 6: ['opel']}

Upvotes: 1

Daweo
Daweo

Reputation: 36370

It looks like task for collections.defaultdict I would do:

import collections
list1 = [
[1, "ford"],
[2,"Ferrari"],
[3, "Mercedes"],
[4, "BMW"]
]
list2 = [
[1, "mustang"],
[2,"LaFerrari"],
[3,"CLA"],
[4,"M5"]
]
result = collections.defaultdict(list)
for key, value in list1:
    result[key].append(value)
for key, value in list2:
    result[key].append(value)
result = dict(result)
print(result)

Output:

{1: ['ford', 'mustang'], 2: ['Ferrari', 'LaFerrari'], 3: ['Mercedes', 'CLA'], 4: ['BMW', 'M5']}

Here I used defaultdict with lists, unlike common dict if you try do something with value under key which do not exist yet, it did place list() i.e. empty list, then do requested action (appending in this case). At end I convert it into dict just to fullfill your requirement (create a python dictionary).

Upvotes: 1

doca
doca

Reputation: 1548

If you're sure that both lists contain the same number of items and both has a matching first element in each item (1, 2, 3, 4 in your example),

result =  {k: [dict(list1)[k], dict(list2)[k]] for k in dict(list1)}

Upvotes: 0

Related Questions