【问题标题】:How to split a list into sublists based on unique values of one column?如何根据一列的唯一值将列表拆分为子列表?
【发布时间】:2023-04-06 10:51:01
【问题描述】:

我有一个列表,想根据它在 python 中最后一列的唯一值对其进行拆分。这是我的清单:

pnt=[[1.,2.,4.,'AA'], [0.,0.,0.,'AA'], [2.,1.,0.,'AA'],\
     [0.,-3.,1.,'BB'], [2.,5.,8.,'BB'], [.1,3.,0.,'CC']]

我想得到它:

pnt=[[[1.,2.,4.,'AA'], [0.,0.,0.,'AA'], [2.,1.,0.,'AA']],\
     [[0.,-3.,1.,'BB'], [2.,5.,8.,'BB']], [[.1,3.,0.,'CC']]]

我阅读了this solution,但仍然无法解决我的问题。

【问题讨论】:

  • itertools.groupby 带钥匙
  • 亲爱的@Jean-François Fabre,我该如何使用您提到的这种方法?我见过它,但我不知道如何用它来做我想做的事。

标签: python list split


【解决方案1】:

itertools.groupby 是您需要的功能。需要自定义从每个列表的第四个元素检查key。

然后元素和返回值本身需要强制为list 才能看到实际结果(否则它被优化为生成器函数)。我们丢弃了键(使用_),因为我们只对元素感兴趣,而不是用于对它们进行分组的值。

import itertools

pnt=[[1.,2.,4.,'AA'], [0.,0.,0.,'AA'], [2.,1.,0.,'AA'],\
     [0.,-3.,1.,'BB'], [2.,5.,8.,'BB'], [.1,3.,0.,'CC']]

print([list(x) for _,x in itertools.groupby(pnt,lambda x:x[3])])

结果:

[[[1.0, 2.0, 4.0, 'AA'], [0.0, 0.0, 0.0, 'AA'], [2.0, 1.0, 0.0, 'AA']],
 [[0.0, -3.0, 1.0, 'BB'], [2.0, 5.0, 8.0, 'BB']],
 [[0.1, 3.0, 0.0, 'CC']]]

请注意,此方法只会对连续的组进行分组。

【讨论】:

    【解决方案2】:

    您可以使用dict 来获得所需的输出。

    例如:

    pnt=[[1.,2.,4.,'AA'], [0.,0.,0.,'AA'], [2.,1.,0.,'AA'],\
         [0.,-3.,1.,'BB'], [2.,5.,8.,'BB'], [.1,3.,0.,'CC']]
    
    result = {}
    for i in pnt:
        result.setdefault(i[-1], []).append(i)  # Form Dict with key as last value from list and value as the list
    
    print(list(result.values()))    # Get Values of Dict
    

    输出:

    [[[1.0, 2.0, 4.0, 'AA'], [0.0, 0.0, 0.0, 'AA'], [2.0, 1.0, 0.0, 'AA']],
     [[0.0, -3.0, 1.0, 'BB'], [2.0, 5.0, 8.0, 'BB']],
     [[0.1, 3.0, 0.0, 'CC']]]
    

    【讨论】:

      猜你喜欢
      • 2015-05-13
      • 1970-01-01
      • 2015-12-13
      • 2020-11-02
      • 2017-08-06
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 2020-05-02
      相关资源
      最近更新 更多