Python 3.x 按共同元素动态分组二维列表中的元素
[('20bgx6', 'HQ', 'Head Quarters'),
('2040bl', 'NVA', 'North Vietnamese Army '),
('2040bl', 'HEAT', 'High Explosive Anti Tank '),
('2040bl', 'HEAT', 'High Explosive Anti Tank '),
('202kon', 'HEAT', 'High Explosive Anti Tank '),
('202kon', 'EFP', 'Explosively Formed Penetrator/Projectile'),
('202kon', 'NCO', 'Non-commissioned officer'),
('202kon', 'MRAP', 'Mine Resistant Ambush Protected'),
('202kon', 'UXO', 'Unexploded Ordnance'),
('202kon', 'MP', 'Military Police'),
('202kon', 'CQ', 'Charge of Quarters'),
('202kon', 'HQ', 'Head Quarters'),
('202kon', 'NCO', 'Non-commissioned officer'),
('1zz081', 'BC', 'Battalion Commander'),
('1zz081', 'HMMWV', 'High Mobility Multi Wheeled Vehicle'),
('1zz081', 'SALUTE', 'Size Activity Location Uniform Time Equipment '),
('1zxpbs', 'NCO', 'Non-commissioned officer'),
('1ztrv6', 'SALUTE', 'Size Activity Location Uniform Time Equipment '),
('1ztrv6', 'HEAT', 'High Explosive Anti Tank '),
('1ztrv6', 'BDU', 'Battle Dress Uniform, predecessor to the ACU'),
('1zs9gz', 'AG', 'Adjutant General'),
('1zs9gz', 'HEAT', 'High Explosive Anti Tank ')]
我会有一个列表,里面的内容需要分组,要求是所有以相同ID标签开头的元素(比如2040bl、202kon等)都放在各自的小列表里。
所以,所有以'2040bl'开头的元素会被放到一个小组里,所有这些小组都在同一个大列表里。最后得到的这个大列表会有7个小组,因为有7个独特的ID标签(每个小列表的第一个元素)。
我用的是Python 3。
1 个回答
4
你可以使用 itertools.groupby
这个方法。根据你的数据,这个方法应该可以直接使用。比如:
from itertools import groupby
for k, v in groupby(l, key=lambda t: t[0]) # assuming your list is stored in l
print('%s\n\t%s' % (k, list(v)))
这段代码的输出结果是:
20bgx6
[('20bgx6', 'HQ', 'Head Quarters')]
2040bl
[('2040bl', 'NVA', 'North Vietnamese Army '), ('2040bl', 'HEAT', 'High Explosive Anti Tank '), ('2040bl', 'HEAT', 'High Explosive Anti Tank ')]
202kon
[('202kon', 'HEAT', 'High Explosive Anti Tank '), ('202kon', 'EFP', 'Explosively Formed Penetrator/Projectile'), ('202kon', 'NCO', 'Non-commissioned officer'), ('202kon', '
MRAP', 'Mine Resistant Ambush Protected'), ('202kon', 'UXO', 'Unexploded Ordnance'), ('202kon', 'MP', 'Military Police'), ('202kon', 'CQ', 'Charge of Quarters'), ('202kon', 'HQ', '
Head Quarters'), ('202kon', 'NCO', 'Non-commissioned officer')]
1zz081
[('1zz081', 'BC', 'Battalion Commander'), ('1zz081', 'HMMWV', 'High Mobility Multi Wheeled Vehicle'), ('1zz081', 'SALUTE', 'Size Activity Location Uniform Time Equipment ')
]
1zxpbs
[('1zxpbs', 'NCO', 'Non-commissioned officer')]
1ztrv6
[('1ztrv6', 'SALUTE', 'Size Activity Location Uniform Time Equipment '), ('1ztrv6', 'HEAT', 'High Explosive Anti Tank '), ('1ztrv6', 'BDU', 'Battle Dress Uniform, predecess
or to the ACU')]
1zs9gz
[('1zs9gz', 'AG', 'Adjutant General'), ('1zs9gz', 'HEAT', 'High Explosive Anti Tank ')]
重要提示:使用 groupby
时,数据需要按照分组的关键字进行排序,在你的例子中已经排序好了。如果没有排序,你可以在分组之前加上 sorted(l, key=lambda t:t[0])
来进行排序。