按第n个元素分组列表

时间:2016-07-13 14:33:51

标签: python list

我有一个像下面那样的二维列表

original_list = [['2', 'Out', 'Words', 'Test3', '21702-1201', 'US', 41829.0, 'VN', 'Post', 'NAI'],
                 ['Test', 'Info', 'More Info', 'Stuff', '63123-7802', 'US', 40942.0, 'CM', 'User Info', 'VAI'],
                 ['Test1', 'Info1', 'More Info1', 'Stuff1', '63123-7802', 'US', 40942.0, 'CM', 'User Info1', 'VAI'],
                 ['1', 'Information', 'Things', 'NE', '68064-9782', 'US', 40106.0, 'DRH', 'Another User', 'NAI'],]

我已经按邮政编码对列表进行了排序。现在我想通过邮政编码将列表拆分为第5个元素,并将邮政编码分组到相同的新列表中。我还想通过前5个邮政编码对它们进行排序,忽略最后一个。我怎么能这样做?我试图使用zip功能,但我无法将它组合在一起。

编辑:

所需的输出看起来像这样。

new_list1 = ['2', 'Out', 'Words', 'Test3', '21702-1201', 'US', 41829.0, 'VN', 'Post', 'NAI']
new_list2 = ['Test', 'Info', 'More Info', 'Stuff', '63123-7802', 'US', 40942.0, 'CM', 'User Info', 'VAI'],
            ['Test1', 'Info1', 'More Info1', 'Stuff1', '63123-7802', 'US', 40942.0, 'CM', 'User Info1', 'VAI']
new_list3 = ['1', 'Information', 'Things', 'NE', '68064-9782', 'US', 40106.0, 'DRH', 'Another User', 'NAI']

关于问题的第二部分。如果我有两个包含拉链的列表,其中前5个数字相同,但最后4个不同,它会将这些组合在一起。例如,如果以上两个邮政编码是63123-7802和63123-8956,则这些邮政编码将组合在一起。

1 个答案:

答案 0 :(得分:2)

您可以使用itertools.groupby

>>> from itertools import groupby
>>> l = [['2', 'Out', 'Words', 'Test3', '21702-1201', 'US', 41829.0, 'VN', 'Post', 'NAI'],
...      ['Test', 'Info', 'More Info', 'Stuff', '63123-7802', 'US', 40942.0, 'CM', 'User Info', 'VAI'],
...      ['Test1', 'Info1', 'More Info1', 'Stuff1', '63123-7802', 'US', 40942.0, 'CM', 'User Info1', 'VAI'],
...      ['1', 'Information', 'Things', 'NE', '68064-9782', 'US', 40106.0, 'DRH', 'Another User', 'NAI'],]
>>> zip_retriever = lambda sub_l: sub_l[4].split('-')[0] # Grab the part leading up to '-' in the zip code
>>> for zip_code, vals in groupby(l, zip_retriever):
...     print zip_code, list(vals)
...     
21702 [['2', 'Out', 'Words', 'Test3', '21702-1201', 'US', 41829.0, 'VN', 'Post', 'NAI']]
63123 [['Test', 'Info', 'More Info', 'Stuff', '63123-7802', 'US', 40942.0, 'CM', 'User Info', 'VAI'], ['Test1', 'Info1', 'More Info1', 'Stuff1', '63123-7802', 'US', 40942.0, 'CM', 'User Info1', 'VAI']]
68064 [['1', 'Information', 'Things', 'NE', '68064-9782', 'US', 40106.0, 'DRH', 'Another User', 'NAI']]
>>>