将字典列表中的两个列表合并为一个

时间:2019-01-29 06:56:49

标签: python python-3.x dictionary

我想合并名称重复的人群的年龄列表...

我的代码:

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)

输出为:

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

我希望输出为:

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

有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

还有更多的Python语言,您需要链接列表。同样,不需要那么多循环。单线应做。

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

不带itertools的变体为:

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

使用集合的字典而不是列表的字典:

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

将您的O(N**3)算法转换为O(N)算法的原因(因为在in中进行list的查找是O(N),而在{{ {1}}。

如果缺少密钥,只需将O(1)替换为set甚至是dic1[k]

答案 1 :(得分:0)

您可以使用其他答案中提到的itertools,也可以只是简化自己的代码。 无需为循环嵌套三层。由于python只允许 唯一键,您可以像这样消除最里面的for循环:

output_list = []  

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

print(output_list)

同样,当您获得要显示的所需年龄列表时,请使用简单的+=将其添加到output_list。 尽管上面的代码更容易理解,但我还是建议您使用itertools。