【问题标题】:Zip two lists in dictionary but keep duplicates in key在字典中压缩两个列表,但在键中保留重复项
【发布时间】:2017-10-31 23:46:06
【问题描述】:

我有两个列表:

alist = ['key1','key2','key3','key3','key4','key4','key5']

blist=  [30001,30002,30003,30003,30004,30004,30005]

我想合并这些列表并将它们添加到字典中。

我尝试dict(zip(alist,blist)) 但这给出了:

{'key3': 30003, 'key2': 30002, 'key1': 30001, 'key5': 30005, 'key4': 30004}

所需的字典形式是:

{'key1': 30001, 'key2': 30002, 'key3': 30003,'key3':30003, 'key4': 30004, 'key4': 30004, 'key5': 30005}

我想将重复项保留在字典中,并且不将值加入同一个键中(... key3': 30003,'key3':30003,...)。这可能吗?

提前致谢。

【问题讨论】:

  • 你不能这样做
  • key 中的dict 不能有同名
  • 所以,最好用元组炒锅
  • 是的,字典必须具有唯一的、可散列的键,因此您需要查看非键集合,例如列表或元组。正如您可能知道的那样,集合也会删除重复项。还有另一种可能的解决方案here
  • 是的,使用提到的列表或元组。试试这个代码:tuple(zip(alist, blist)) 或 list(zip(alist, blist))。

标签: python python-2.7 dictionary


【解决方案1】:

您不能这样做,因为dict 对象具有唯一键。你应该只是元组的使用列表:

>>> alist = ['key1','key2','key3','key3','key4','key4','key5']
>>> blist=  [30001,30002,30003,30003,30004,30004,30005]

>>> zip(alist, blist)
[('key1', 30001), ('key2', 30002), ('key3', 30003), ('key3', 30003), ('key4', 30004), ('key4', 30004), ('key5', 30005)]

如果您想根据键访问所有值,您可以使用collections.defaultdict as:

>>> from collections import defaultdict

>>> my_dict = defaultdict(list)
>>> for k, v in zip(alist, blist):
...     my_dict[k].append(v)
...
>>> my_dict
defaultdict(<type 'list'>, {'key3': [30003, 30003], 'key2': [30002], 'key1': [30001], 'key5': [30005], 'key4': [30004, 30004]})

您可以访问defaultdict,类似于普通的 dict 对象。例如:

>>> my_dict['key3']
[30003, 30003]

【讨论】:

    【解决方案2】:

    字典使用 UNIQUE 键,因此不可能有重复。

    【讨论】:

      【解决方案3】:

      由于 dict 只能使用唯一键,如果您两次插入相同的键,最后一个键将被存储 - 这可能是您可以使用的:

      from itertools import groupby
      
      alist = ['key1','key2','key3','key3','key4','key4','key5']
      alist = [i for i, j in groupby(alist)]
      
      blist = [30001,30002,30003,30003,30004,30004,30005]
      blist = [list(j) for i, j in groupby(blist)]
      
      print dict(zip(alist, blist))
      #{'key3': [30003, 30003], 'key2': [30002], 'key1': [30001], 'key5': [30005], 'key4': [30004, 30004]}
      

      如果您也想保留密钥顺序,您可以使用 OrderedDict:

      from collections import OrderedDict
      print OrderedDict(zip(alist, blist))
      

      【讨论】:

        猜你喜欢
        • 2016-07-08
        • 2020-05-06
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 2023-02-23
        • 2014-12-27
        • 1970-01-01
        相关资源
        最近更新 更多