如何根据python的前身删除列表项

Spa*_*ska 18 python list

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

输入:

[(1, 'a'), (2, 'b'), (2, 'b'), (2, 'c'), (3, 'd'), (2, 'e')]
Run Code Online (Sandbox Code Playgroud)

所需输出:

[(1, 'a'), (2, 'b'), (3, 'd'), (2, 'e')]
Run Code Online (Sandbox Code Playgroud)

不能使用setdict,因为顺序很重要。

无法使用列表推导功能[x for x in somelist if not determine(x)],因为检查取决于前任。

我想要的是这样的:

[(1, 'a'), (2, 'b'), (2, 'b'), (2, 'c'), (3, 'd'), (2, 'e')]
Run Code Online (Sandbox Code Playgroud)

用Python解决此问题的首选方法是什么?

gmd*_*mds 17

您可以使用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))]
Run Code Online (Sandbox Code Playgroud)

输出:

[(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a'), (2, 'a'), (3, 'a')]
Run Code Online (Sandbox Code Playgroud)

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

result = []

for first, second in zip(data, data[1:]):
    if first[0] != second[0]:
        result.append(first)

result
Run Code Online (Sandbox Code Playgroud)

输出:

[(1, 'a'), (2, 'b'), (3, 'a'), (4, 'a'), (2, 'a')]
Run Code Online (Sandbox Code Playgroud)

请注意,这将保留最后一个重复项,而不是第一个重复项。


yat*_*atu 12

为了删除连续的重复项,您可以使用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')]
Run Code Online (Sandbox Code Playgroud)


Hen*_*Yik 7

如果我没记错的话,您只需要查找最后一个值。

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)
Run Code Online (Sandbox Code Playgroud)

输出:

[(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a'), (3, 'a'), (4, 'a')]
Run Code Online (Sandbox Code Playgroud)