我循环遍历一个列表,该列表生成包含两个项目的列表,例如;
['string1', '1234567']
['string1', '1234576']
['string1', '1234765']
['string2', '7654321']
['string2', '7654123']
列表中的第一项可以重复,列表中的第二项始终是唯一的。我想重组列表,以便生成以下输出。我希望列表中的第一个项目与相应的第二个项目是唯一的。所需的输出;
['string1', ['1234567', '1234576','1234765']]
['string2', ['7654321','7654123']]
生成列表中第二个项目的新列表是否有用,然后创建一个新列表以从第一个项目中获取唯一字符串?然后比较两个列表并以某种方式映射它们......我真的不知道。我不知道是否有某种Python功能吗?
答案 0 :(得分:8)
由于数据已排序,您可以使用itertools.groupby
:
from itertools import groupby
l = [['string1', '1234567'],
['string1', '1234576'],
['string1', '1234765'],
['string2', '7654321'],
['string2', '7654123']]
l2 = [[k, [x[1] for x in g]] for k, g in groupby(l, key=lambda x: x[0])]
# [['string1', ['1234567', '1234576', '1234765']],
# ['string2', ['7654321', '7654123']]]
如果数据没有排序,您可以使用collections.defaultdict
收集每个数据的所有第二个元素。这与mshsayem在他使用香草dict
和setdefault
的答案中选择的方法基本相同:
from collections import defaultdict
d = defaultdict(list)
for x, y in l:
d[x].append(y)
l2 = d.items()
# [('string2', ['7654321', '7654123']),
# ('string1', ['1234567', '1234576', '1234765'])]
答案 1 :(得分:2)
这是一种方式:
>>> l = [['string1', '1234567']
,['string1', '1234576']
,['string1', '1234765']
,['string2', '7654321']
,['string2', '7654123']]
>>> result = {}
>>> for li in l:
result.setdefault(li[0],[]).append(li[1])
>>> result
{'string2': ['7654321', '7654123'], 'string1': ['1234567', '1234576', '1234765']}
如果您想要列表(作为您的问题),您可以这样做:
>>> map(list,result.items())
[['string2', ['7654321', '7654123']], ['string1', ['1234567', '1234576', '1234765']]]