list - 在python中,如何根据前置项移除列表项

给定一个 python 列表,我想删除连续的'重复项'。 但是,重复值是列表项的属性(在此示例中是第一个元组元素)。

输入:


[(1, 'a'), (2, 'b'), (2, 'b'), (2, 'c'), (3, 'd'), (2, 'e')]



所需输出:


[(1, 'a'), (2, 'b'), (3, 'd'), (2, 'e')]



无法使用 set 或者 dict,因为顺序很重要。

无法使用列表理解 [x for x in somelist if not determine(x)] 因为该检查依赖于前一个。

我想要的是这样的东西:


mylist = [...]



for i in range(len(mylist)):


 if mylist[i-1].attr == mylist[i].attr:


 mylist.remove(i)



在 python 中解决这个问题的首选方法是什么?

时间:

你可以使用 itertools.groupby ( 更多数据演示):


from itertools import groupby


from operator import itemgetter



data = [(1, 'a'), (2, 'a'), (2, 'b'), (3, 'a'), (4, 'a'), (2, 'a'), (2, 'a'), (3, 'a'), (3, 'a')]



[next(group) for key, group in groupby(data, key=itemgetter(0))]



输出:


[(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a'), (2, 'a'), (3, 'a')]



为了完整,基于其他答案的迭代方法:


result = []



for first, second in zip(data, data[1:]):


 if first[0]!= second[0]:


 result.append(first)



result



输出:


[(1, 'a'), (2, 'b'), (3, 'a'), (4, 'a'), (2, 'a')]



请注意,这将保留的最后一个副本,而不是第一个。

要删除连续重复项,可以使用 itertools.groupby:


l = [(1, 'a'), (2, 'a'), (2, 'a'), (3, 'a'), (4, 'a')]


from itertools import groupby


[tuple(k) for k, _ in groupby(l)]


# [(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a')]



如果我没有错,你只需要查找最后一个值。


test = [(1, 'a'), (2, 'a'), (2, 'a'), (3, 'a'), (4, 'a'),(3, 'a'),(4,"a"),(4,"a")]



result = []



for i in test:


 if result and i[0] == result[-1][0]: #edited since OP considers (1,"a") and (1,"b") as duplicate


 #if result and i == result[-1]:


 continue


 else:


 result.append(i)



print (result)



输出:


[(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a'), (3, 'a'), (4, 'a')]



我会稍微改变一下Henry Yik的建议,让它更简单一些。 不确定我是否遗漏了什么。


inputList = [(1, 'a'), (2, 'a'), (2, 'a'), (3, 'a'), (2, 'a')]


outputList = []


lastItem = None



for item in inputList:


 if not item == lastItem:


 outputList.append(item)


 lastItem = item


print(outputList)



...