我有以下列表
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]
感谢任何帮助。
答案 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]]