【问题标题】:Form a dictionary that key is from a list, value is the occurrence of items in another list in Python形成一个字典,键来自一个列表,值是Python中另一个列表中项目的出现
【发布时间】:2015-08-10 17:17:42
【问题描述】:

给定两个长度相同的列表:

List1 = ['a','b','c','d','b','a','b','c']
List2 = ['1','2','3','4','5','6','7','8']

我想将一个字典输出为:

dic = {'a':['1','6'], 'b':['2','5','7'], 'c':['3','8'], 'd':['4']}

如何在 Python 中实现它?谢谢!

【问题讨论】:

  • 您自己尝试过解决方案吗?

标签: python list dictionary count


【解决方案1】:

您可以使用zip 函数创建一个列列表(在python 3.X 中是一个迭代器)并使用dict.setdefault 方法(或collections.defaultdict)创建一个期望字典:

>>> List1 = ['a','b','c','d','b','a','b','c']
>>> List2 = ['1','2','3','4','5','6','7','8']
>>> 
>>> d={}
>>> for i,j in zip(List1,List2):
...   d.setdefault(i,[]).append(j)
... 
>>> d
{'a': ['1', '6'], 'c': ['3', '8'], 'b': ['2', '5', '7'], 'd': ['4']}

如果您关心订单,可以使用collections.OrderedDict

>>> from collections import OrderedDict
>>> d=OrderedDict()
>>> for i,j in zip(List1,List2):
...   d.setdefault(i,[]).append(j)
... 
>>> d
OrderedDict([('a', ['1', '6']), ('b', ['2', '5', '7']), ('c', ['3', '8']), ('d', ['4'])])
>>> 

【讨论】:

    【解决方案2】:

    我会使用collections.defaultdictzip() 方法。示例 -

    >>> List1 = ['a','b','c','d','b','a','b','c']
    >>> List2 = ['1','2','3','4','5','6','7','8']
    >>>
    >>> from collections import defaultdict
    >>> outd = defaultdict(list)
    >>> for x,y in zip(List1,List2):
    ...     outd[x].append(y)
    ...
    >>> outd
    defaultdict(<class 'list'>, {'c': ['3', '8'], 'd': ['4'], 'b': ['2', '5', '7'], 'a': ['1', '6']})
    

    【讨论】:

      【解决方案3】:

      使用itertools.groupby 的替代解决方案。事实上, groupby 似乎更自然的解决方案,因为它更明确地倾向于实现。 总而言之,合并两个列表并根据列表中的第一项对它们进行分组。

      实施

      >>> from itertools import groupby
      >>> from operator import itemgetter
      >>> {k: map(itemgetter(1), v)
           for k, v in groupby(sorted(zip(List1, List2)),
                               key = itemgetter(0))}
      

      输出

      {'a': ['1', '6'], 'c': ['3', '8'], 'b': ['2', '5', '7'], 'd': ['4']}
      

      off-course 正如其他人所说,如果顺序很重要,您可以使用collections.OrderedDict

      实施

      >>> from collections import OrderedDict
      >>> OrderedDict((k, map(itemgetter(1), v))
                      for k, v in groupby(sorted(zip(List1, List2)),
                                          key = itemgetter(0)))
      

      输出

      OrderedDict([('a', ['1', '6']), ('b', ['2', '5', '7']), ('c', ['3', '8']), ('d', ['4'])])
      

      【讨论】:

        猜你喜欢
        • 2021-07-12
        • 1970-01-01
        • 1970-01-01
        • 2022-08-08
        • 2016-07-15
        • 2021-05-31
        • 2020-10-25
        • 2022-06-23
        • 1970-01-01
        相关资源
        最近更新 更多