【问题标题】:Python list in list reformatting列表重新格式化中的 Python 列表
【发布时间】:2016-08-20 02:12:34
【问题描述】:

重组我的以下数据的pythonic方法是什么?

我有一个数据

data = [
        ['a','b',1], ['a','b',2], ['a','b',3],
        ['a','c',3], ['a','c',4],
        ['f','g',2], ['f','g',5], ['f','g',9]
       ]

我想将其重新排列为以下格式:

data = [
        ['a', 'b', 1, 2, 3], 
        ['a', 'c', 3, 4], 
        ['f', 'g', 2, 5, 9]
       ]

所以基本上每个内部列表中的这两个第一个元素是区分不同项目的方法,后面的数字是数据。我只想为包含所有数据的每个项目设置一行。

【问题讨论】:

    标签: python list list-comprehension dictionary-comprehension


    【解决方案1】:
    import collections
    
    keyed = collections.defaultdict(list) # (a,b): [1,2,3]
    
    for k1,k2,val in data:
        keyed[(k1,k2)].append(val)
    
    [list(keys) + vals for keys,vals in sorted(keyed.items())]
    

    【讨论】:

      【解决方案2】:

      您可以使用字典根据每个子列表中的前两项对项目进行分类,然后使用列表推导来连接字典的键和值:

      请注意,使用OrderedDict 的原因是它会为您保留订单。

      >>> from collections import OrderedDict
      >>> d = OrderedDict()
      >>> 
      >>> for i, j, k in data:
      ...     d.setdefault((i, j), []).append(k)
      ... 
      >>> [[i,j] + k for (i,j), k in d.items()]
      [['a', 'b', 1, 2, 3], ['a', 'c', 3, 4], ['f', 'g', 2, 5, 9]]
      

      如果您正在处理大型列表并且您关心内存优化,您可以使用来自itertools 模块的groupbychain 函数,它们返回迭代器:

      >>> from itertools import groupby, chain
      >>> from operator import itemgetter
      >>> from collections import OrderedDict
      
      >>> [OrderedDict.fromkeys(chain.from_iterable(g)).keys() for _,g in groupby(data, key=itemgetter(0, 1))]
      [['a', 'b', 1, 2, 3], ['a', 'c', 3, 4], ['f', 'g', 2, 5, 9]]
      

      【讨论】:

        猜你喜欢
        • 2016-02-27
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多