基于元素的属性对List的元素进行分组

时间:2011-03-29 20:06:25

标签: python

我有以下列表

List=[
    ('G1', 'CFS', 'FCL', 'R1'),
    ('G3', 'LOOSEFREIGHT', 'MIXEDLCL', 'R9'),
    ('G4', 'CFS', 'FCL', 'R10'),
    ('G2', 'LOOSEFREIGHT', 'LCL', 'R4'),
    ('G1', 'CFS', 'FCL', 'R2'),
    ('G2', 'LOOSEFREIGHT', 'LCL', 'R5'),
    ]

现在我想首先按照索引[1](即CFS和LOOSEFREIGHT)将List的这些元素组合在一起,对于那些为LOOSEFREIGHT组合在一起的元素,我想根据索引将它们进一步划分为不同的组[2 ](即LCL或MIXEDLCL)。

基本上我希望它们分组到不同的列表中,我的解决方案应该是

形式
New_List=[
    [
        ('G1', 'CFS', 'FCL', 'R1'),
        ('G1', 'CFS', 'FCL', 'R2'),
        ('G4', 'CFS', 'FCL', 'R10')
    ],
    [
        ('G2',  'LOOSEFREIGHT', 'LCL', 'R4'),
        ('G2', 'LOOSEFREIGHT', 'LCL', 'R5')
    ],
    [
        ('G3', 'LOOSEFREIGHT', 'MIXEDLCL', 'R9')
    ],
    ]

我该怎么做?

我设法根据索引[1]将它们分成不同的列表但是我无法根据索引进一步划分它们[2]

感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

如果这是一次性任务列表 - 理解可能是最简单的解决方案:

>>> new_list = []
>>> new_list.append([i for i in L if i[1] == 'CFS']) # where L is your original list
>>> new_list.append([i for i in L if i[1] == 'LOOSEFREIGHT' and i[2] == 'LCL'])
>>> new_list.append([i for i in L if i[1] == 'LOOSEFREIGHT' and i[2] == 'MIXEDLCL'])
>>> from pprint import pprint as pp
>>> pp(new_list)
[[('G1', 'CFS', 'FCL', 'R1'),
  ('G4', 'CFS', 'FCL', 'R10'),
  ('G1', 'CFS', 'FCL', 'R2')],
 [('G2', 'LOOSEFREIGHT', 'LCL', 'R4'), ('G2', 'LOOSEFREIGHT', 'LCL', 'R5')],
 [('G3', 'LOOSEFREIGHT', 'MIXEDLCL', 'R9')]]

如果您需要更一般情况的示例 - 您不一定事先知道可能的群组数量 - 您可以使用itertools.groupby这样的内容:

import itertools as it
import operator as op
new_list = []
for k,g in it.groupby(sorted(L, key=op.itemgetter(1,2)), key=op.itemgetter(1,2)):
    new_list.append(list(g))
pp(new_list)

结果:

[[('G1', 'CFS', 'FCL', 'R1'),
  ('G4', 'CFS', 'FCL', 'R10'),
  ('G1', 'CFS', 'FCL', 'R2')],
 [('G2', 'LOOSEFREIGHT', 'LCL', 'R4'), ('G2', 'LOOSEFREIGHT', 'LCL', 'R5')],
 [('G3', 'LOOSEFREIGHT', 'MIXEDLCL', 'R9')]]

答案 1 :(得分:0)

这是一个使用dict的答案,其中键是索引[1](例如'CFS'),它的值是另一个dict,其键是索引[2](例如'FCL')。此示例创建结构,然后使用for循环打印出所需的排序顺序。它比亚当的回答更强大,因为他专门为某些价值观而建立:

sorted_values = []
d = {}
for entry in a:
  d[entry[1]] = { entry[2]: entry }

for i in sorted(d):
  for j in sorted(d[i]):
    sorted_values.append(d[i][j])

因此,当您打印sorted_values时,您会得到:

[[('G1', 'CFS', 'FCL', 'R1'), ('G4', 'CFS', 'FCL', 'R10'), ('G1', 'CFS', 'FCL', 'R2')], [('G2', 'LOOSEFREIGHT', 'LCL', 'R4'), ('G2', 'LOOSEFREIGHT', 'LCL', 'R5')]]

答案 2 :(得分:0)

我会制作一个自定义排序程序:

def custom_sort(data):
    cfs = []
    loose_lcl = []
    loose_mixed = []
    for row in data:
        if row[1] == 'CFS':
            cfs.append(row)
        elif row[1] == 'LOOSEFREIGHT' and row[2] == 'LCL':
            loose_lcl.append(row)
        elif row[1] == 'LOOSEFREIGHT' and row[2] == 'MIXEDLCL':
            loose_mixed.append(row)
        else:
            raise ValueError("Unknown data: %r" % (row,))
    return [cfs, [loose_lcl, loose_mixed]]