PARTH KHAMAR
PARTH KHAMAR

Reputation: 237

combine two lists in a list of dictionaries into one

I want to combine the list of ages of the groups which are having a repeated name...

My code:

dic1 = {'g1': ['45', '35', '56', '65'], 'g2': ['67', '76'], 'g3':['8', '96']}
dic2 = {'g1': ['akshay', 'swapnil', 'parth','juhi'], 'g2': ['megha', 'varun'], 'g3': ['gaurav', 'parth']}

for key2,name_list in dic2.items():
   for name in name_list:
      if name=='parth':
         for key1,age_list in dic1.items():
            if key1==key2:
               print(age_list)

The output is:

['45', '35', '56', '65']
['8', '96']

I want the output as:

['45', '35', '56', '65', '8', '96']

Can someone help me with this?

Upvotes: 2

Views: 62

Answers (2)

Jean-François Fabre
Jean-François Fabre

Reputation: 140168

there's more pythonic than that, you need to chain the lists. Also, no need for so many loops. A one-liner should do.

dic1 = {'g1': ['45', '35', '56', '65'], 'g2': ['67', '76'], 'g3':['8', '96']}
dic2 = {'g1': ['akshay', 'swapnil', 'parth','juhi'], 'g2': ['megha', 'varun'], 'g3': ['gaurav', 'parth']}

import itertools
result = list(itertools.chain.from_iterable(dic1[k] for k,v in dic2.items() if 'parth' in v))


>>> result
['45', '35', '56', '65', '8', '96']

A variant without itertools would be:

result = [x for k,v in dic2.items() if 'parth' in v for x in dic1[k]]

With a dict of sets instead of a dict of lists:

dic2 = {'g1': {'akshay', 'swapnil', 'parth','juhi'}, 'g2': {'megha', 'varun'}, 'g3': {'gaurav', 'parth'}}

those turn your O(N**3) algorithm into a O(N) algorithm (because in lookup in a list is O(N) but O(1) in a set).

If you have a missing key, just replace dic1[k] by dic1.get(k,[]) or even dic1.get(k) or [].

Upvotes: 1

Polaris000
Polaris000

Reputation: 938

You could either use itertools as mentioned in other answers, or just simplify your own code. There is no need to have a three layer nested for loop. As python only allows unique keys, you could eliminate the innermost for loop like so:

output_list = []  

for key, name_list in dic2.items():
    if "parth" in name_list:
        output_list += dic1[key]

print(output_list)

As and when you get the required age list which is to be displayed, add it to the output_list with a simple +=. Though the above code is easier to understand, I recommend using itertools.

Upvotes: 0

Related Questions