【问题标题】:How to aggregate data from a python list to a dictionary?如何将数据从 python 列表聚合到字典?
【发布时间】:2021-07-27 16:19:47
【问题描述】:

我有一个清单:

A = ['a-1', 'b-1', 'c-2', 'c-1', 'a-2']

在字典(或任何其他数据结构)中聚合数据以获得如下结果的 Python 方式(我不想使用大量嵌套的 for 循环)是什么:


{
'a': ['1', '2'],
'b': ['1'],
'c': ['1', '2'],
}

【问题讨论】:

  • 该结果不是有效的 Python 数据结构。您是指包含列表的字典吗?
  • 是的,抱歉,字典包含列表。
  • 使用collections.defaultdict(list)。循环遍历原始列表,将字符串拆分为前缀和后缀。然后将后缀附加到适当的字典元素。
  • StackOverflow 不是免费的编码服务。你应该try to solve the problem first。请更新您的问题以在minimal reproducible example 中显示您已经尝试过的内容。如需更多信息,请参阅How to Ask,并拨打tour :)

标签: python dictionary data-structures aggregate data-analysis


【解决方案1】:

IIUC,这是一种方法:

from collections import defaultdict

result = defaultdict(list)
for i in A:
    a, b = i.split('-')
    result[a].append(b)

输出:

defaultdict(list, {'a': ['1', '2'], 'b': ['1'], 'c': ['2', '1']})

注意:您也可以使用setdefault

result = {}
for i in A:
    a, b = i.split('-')
    result.setdefault(a, []).append(b)

【讨论】:

    【解决方案2】:

    我会使用mapreduce

    from functools import reduce
    
    reduce(
        lambda d, a: {**d, a[0]: d.get(a[0], []) + [a[1]]},
        map(lambda a: a.split("-"), A),
        {}
    )
    

    解释

    首先,我使用映射将A 中的- 拆分为每个项目。

    map(lambda a: a.split("-"), A)
    

    接下来,我把它变成字典。 lambda 获取字典和下一对值。我将字典解包到一个新字典中,然后将值的第一项用作键,将字典中的当前值或空数组分配给它,并将其与当前值连接。

    lambda d, a: {**d, a[0]: d.get(a[0], []) + [a[1]]}
    

    【讨论】:

      【解决方案3】:

      您可以使用collections.defaultdict

      from collections import defaultdict
      A = ['a-1', 'b-1', 'c-2', 'c-1', 'a-2']
      dict3 = defaultdict(list)
      for i in A:
          one,two=i.split('-')
          dict3[one].append(two)
      print(dict(dict3))
      

      你也可以这样做:

      dict1={}
      for j in A:
          a,b=j.split('-')
          if a in dict1:
              dict1[a].append(b)
          else:
              dict1[a]=[b]
      print(dict1)
      

      【讨论】:

        【解决方案4】:

        由于您希望字符串的第一个元素和最后一个元素分别成为输出字典的键和值,您可以简单地使用它们的索引来访问它们 索引 0 是第一个,索引 -1 是最后一个。

        然后创建一个空的默认字典,以列表为参数 如下代码所示追加到字典中

          from collections import *
             A = ['a-1', 'b-1', 'c-2', 'c-1', 'a-2']
        
             dict = defaultdict(list)
             for l in A:
              p = l[0]
              q = l[-1]
              dict[p].append(q)
              print(dict)
        

        【讨论】:

          【解决方案5】:

          myList,就是你的列表,它会把它倒进myDict:

          myDict = {}
          myList = ['a-1', 'b-1', 'c-2', 'c-1', 'a-2']
          for i in myList:
              a, b = i.split('-')
              if a in myDict:
                  myDict[a] += [b]
              else:
                  myDict[a] = [b]
          for j in myDict:
              print(j, ' = ', myDict[j])
          

          它将i设置为列表中的一个对象,然后将键和值用“-”分开,如果相同的键存在,它将值添加到它的列表中,如果没有,它将制作键并设置值

          输出:

          a  =  ['1', '2']
          b  =  ['1']
          c  =  ['2', '1']
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-11-05
            • 1970-01-01
            • 2018-10-27
            • 2013-02-19
            • 2019-07-24
            • 1970-01-01
            • 1970-01-01
            • 2019-03-26
            相关资源
            最近更新 更多