如何在python中处理字典的多个键?

时间:2018-05-29 08:27:16

标签: python list dictionary

如果找到重复的密钥,我一直在搜索如何为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进行预期输出?

3 个答案:

答案 0 :(得分:5)

defaultdict / dict.setdefault

让我们跳进去吧:

  1. 连续迭代项目
  2. 追加属于同一个键的字符串值
  3. 完成后,迭代每个键值对并将所有内容连接在一起以获得最终结果。
  4. 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'}
    

    Pandas 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'}