【问题标题】:Problems while zipping two lists as a dictionary?将两个列表压缩为字典时出现问题?
【发布时间】:2018-10-25 08:48:32
【问题描述】:

我有以下列表:

a = ['A', 'B', 'C', 'C']

b = ['2', '3', 2, 3]

我将它们压缩如下以获得字典:

a_dict = dict(zip(a,b))

但是,由于最终对象是一个字典,我不能重复键:

{'A': '2', 'B': '3', 'C': 3}

为了拥有这样的东西,我可以有哪些选择? (*):

{'A': '2', 'B': '3', 'C':2, 'C': 3}

我尝试将所有内容都转换为元组,但是我使用 pop 替换字典中的一些键和值:

data['A'] = data.pop('B')

因此,我不能使用元组格式。因此,鉴于以上两个列表,我怎样才能得到(*)?

【问题讨论】:

  • 您可能需要不同的数据结构,因为 dict 不能有重复的键。听起来你有一个XY problem。您在这里的最终目标是什么?
  • 您希望result['C'] 在您提议的对象中是什么?
  • 你不能得到{'A': '2', 'B': '3', 'C':2, 'C': 3}一个键将指向一个字典中的一个值你可以得到类似{'A': '2', 'B': '3', 'C':[2, 3]}的东西
  • 字典不能包含重复的键,那么你想要什么?
  • 你没有回答我的问题。如果您有result = what you want,并且您尝试检索'C',类似于通常的字典中的result['C'],期望得到什么?

标签: python python-3.x list data-structures


【解决方案1】:

解决键冲突的最常见方法,同时仍保留快速索引 dict 的大部分好处,是将值转换为列表:

d = {}
for k, v in zip(a, b):
    d.setdefault(k, []).append(v)

这样d 就变成了:

{'A': ['2'], 'B': ['3'], 'C': [2, 3]}

【讨论】:

    【解决方案2】:

    使用 dicts 无法实现您想要的输出。您可以通过使用@blhsing 的答案来解决名称冲突,或者使用集合来稍微接近您想要的结果,因为我怀疑您想检查数据结构中已经存在的组合,因为您尝试使用元组。

    c = set(zip(a, b))
    

    所以c 变成:

    {('B', '3'), ('C', 3), ('A', '2'), ('C', 2)}
    

    【讨论】:

      【解决方案3】:

      collections中的defaultdict

      from collections import defaultdict
      d=defaultdict(list)
      for k,v in zip(a,b):
         d[k].append(v)
      

      现在:

      print(dict(d))
      

      输出:

      {'A': ['2'], 'B': ['3'], 'C': [2, 3]}
      

      如果关心单个元素列表:

      print({k:(v if len(v)-1 else v[0]) for k,v in d.items()})
      

      输出:

      {'A': '2', 'B': '3', 'C': [2, 3]}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多