将第二个唯一项与第一个项匹配,该项在Python列表中是重复的

时间:2018-01-23 09:43:48

标签: python list

我循环遍历一个列表,该列表生成包含两个项目的列表,例如;

['string1', '1234567']
['string1', '1234576']
['string1', '1234765']
['string2', '7654321']
['string2', '7654123']

列表中的第一项可以重复,列表中的第二项始终是唯一的。我想重组列表,以便生成以下输出。我希望列表中的第一个项目与相应的第二个项目是唯一的。所需的输出;

['string1', ['1234567', '1234576','1234765']]
['string2', ['7654321','7654123']]

生成列表中第二个项目的新列表是否有用,然后创建一个新列表以从第一个项目中获取唯一字符串?然后比较两个列表并以某种方式映射它们......我真的不知道。我不知道是否有某种Python功能吗?

2 个答案:

答案 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在他使用香草dictsetdefault的答案中选择的方法基本相同:

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']]]