【问题标题】:Python: from lists, build dict with key:value ratio not 1:1Python:从列表中构建字典,键值比不是 1:1
【发布时间】:2023-03-11 20:44:02
【问题描述】:

请原谅我没有找到更好的标题。

假设我有两个列表:

list1 = ["123", "123", "123", "456"]
list2 = ["0123", "a123", "1234", "null"]

描述映射(参见this question)。我想从这些列表中创建一个dict,知道list1 包含键和list2 值。在这种情况下,dict 应该是:

dict1 = {"123":("0123", "a123", "1234"), "456":("null",)}

因为list1 告诉我们"123" 与三个值相关联。

如何以编程方式生成这样的字典?

【问题讨论】:

  • 我看不出“null”如何变成“4567”;前者是错误吗?
  • "456":("null",) 也许?

标签: python list dictionary list-comprehension


【解决方案1】:
from collections import defaultdict

dd = defaultdict(list)
for key, val in zip(list1, list2):
    dd[key].append(val)

【讨论】:

    【解决方案2】:

    defaultdict()是你的朋友:

    >>> from collections import defaultdict
    >>> result = defaultdict(tuple)
    >>> for key, value in zip(list1, list2):
    ...    result[key] += (value,)
    ...
    

    这会产生元组;如果列表没问题,请使用 Jon Clement 对相同技术的变体。

    【讨论】:

    • 好吧,每个人都选择了 defaultdict,但是 +1 是为了保持与 OP 一致的元组
    • 谢谢。当所有提供的都同样有效时,不得不接受一个答案是一件可悲的事情,但正如乔恩所说,你与元组保持一致。
    【解决方案3】:
    >>> from collections import defaultdict
    >>> list1 = ["123", "123", "123", "456"]
    >>> list2 = ["0123", "a123", "1234", "null"]
    >>> d = defaultdict(list)
    >>> for i, key in enumerate(list1):
    ...     d[key].append(list2[i])
    ... 
    >>> d
    defaultdict(<type 'list'>, {'123': ['0123', 'a123', '1234'], '456': ['null']})
    >>>
    

    【讨论】:

      【解决方案4】:

      还有一个非默认的解决方案:

      from itertools import groupby
      from operator import itemgetter
      
      dict( (k, tuple(map(itemgetter(1), v))) for k, v in groupby(sorted(zip(list1,list2)), itemgetter(0)))
      

      【讨论】:

      • 哈!非默认字典,迭代 函数 (map)。 :)
      猜你喜欢
      • 1970-01-01
      • 2017-01-09
      • 2015-06-30
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      相关资源
      最近更新 更多