代码之家  ›  专栏  ›  技术社区  ›  PanDe

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

  •  4
  • PanDe  · 技术社区  · 6 年前

    我一直在搜索如何在字典中为单个键添加多个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,我将面临一个特定的挑战,即在dict的“key”中不能有两个8,这是一种默认行为,我理解为什么!!

    处理此类场景的一些选项包括:

    1)查找dict中是否已存在“key”,如果存在,则将新val追加到“key”

    2)创建一个可变的对象来引用每个键,这样您就可以有多个dup键~~实际上不是我的用例。

    那么,如何使用选项1实现预期输出?

    3 回复  |  直到 6 年前
        1
  •  5
  •   cs95 abhishek58g    6 年前

    defaultdict / dict.setdefault

    让我们跳进去:

    1. 连续迭代项
    2. 附加属于同一个键的字符串值
    3. 完成后,对每个键值对进行迭代,并将所有内容连接在一起以获得最终结果。

    from collections import defaultdict
    
    d = defaultdict(list)   
    for i, j in zip(list_1, list_2):
        d[i].append(j)
    

    这个 默认dict 使事情变得简单,并有效地附加。如果你不想使用 默认dict 使用 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

    如果您希望在高容量下运行,请尝试使用熊猫:

    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'}
    
        2
  •  1
  •   Gianluca Micchi    6 年前

    你可以用一个 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的回答比我的更有效,我把这个放在这里,因为它仍然是正确的,我不明白删除它的意义。

        3
  •  1
  •   U13-Forward    6 年前

    尝试使用 setdefault Dictionary函数并获取其索引,然后使用Try和Except检查 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'}