如果找到重复的密钥,我一直在搜索如何为Dict中的单个密钥添加多个val。
我们举一个例子:
list_1 = ['4', '6' ,'8', '8']
list_2 = ['a', 'b', 'c', 'd']
new_dict = dict(zip(list_1,list_2))
...output...
{'8': 'd', '4': 'a', '6': 'b'}
预期产出:
{'8': 'c,d', '4': 'a', '6': 'b'}
为了处理上面两个列表并将它们组合成一个字典,我将面临一个特定的挑战,即我们不能在dict的'key'中有两个8,这是默认行为,我理解为什么! !
处理此类方案的一些选项包括:
1)查找dict中是否已存在'key',如果是,则将新val附加到'key'
2)创建一个可变对象来引用每个键,这样你就可以拥有多个双键~~不是我的用例
那么,我如何使用选项#1进行预期输出?
答案 0 :(得分:5)
defaultdict
/ dict.setdefault
让我们跳进去吧:
from collections import defaultdict
d = defaultdict(list)
for i, j in zip(list_1, list_2):
d[i].append(j)
defaultdict
使事情变得简单,并且附加效率很高。如果您不想使用defaultdict
,请改用dict.setdefault
(但这样效率会更低):
d = {}
for i, j in zip(list_1, list_2):
d.setdefault(i, []).append(j)
new_dict = {k : ','.join(v) for k, v in d.items()})
print(new_dict)
{'4': 'a', '6': 'b', '8': 'c,d'}
DataFrame.groupby
+ agg
如果您想要高容量的表现,请尝试使用pandas:
import pandas as pd
df = pd.DataFrame({'A' : list_1, 'B' : list_2})
new_dict = df.groupby('A').B.agg(','.join).to_dict()
print(new_dict)
{'4': 'a', '6': 'b', '8': 'c,d'}
答案 1 :(得分:1)
您可以使用遍历两个列表的for
循环来执行此操作:
list_1 = ['4', '6' ,'8', '8']
list_2 = ['a', 'b', 'c', 'd']
new_dict = {}
for k, v in zip(list_1, list_2):
if k in new_dict:
new_dict[k] += ', ' + v
else:
new_dict[k] = v
对于庞大的词典可能存在效率问题,但在简单的情况下它会正常工作。
感谢@Ev。 Kounis和@bruno desthuilliers指出了对原始答案的一些改进。
coldspeed的回答比我的回答更有效,我把这个保留在这里,因为它仍然是正确的,我没有看到删除它的重点。
答案 2 :(得分:1)
尝试使用setdefault
字典函数并获取它的索引,然后使用try和除了检查是否存在idx
之外,我每次都没有得到元素的索引因为有重复项,最后我将其格式化,以便输出如您想要的输出:
new_dict = {}
list_1 = ['4', '6' ,'8', '8']
list_2 = ['a', 'b', 'c', 'd']
for i in list_1:
try:
idx+=1
except:
idx = list_1.index(i)
new_dict.setdefault(i, []).append(list_2[idx])
print({k:', '.join(v) for k,v in new_dict.items()})
输出:
{'4': 'a', '6': 'b', '8': 'c, d'}