我想合并名称重复的人群的年龄列表...
我的代码:
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']
有人可以帮我吗?
答案 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。