给定一个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)
不能使用set或dict,因为顺序很重要。
无法使用列表推导功能[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)
如果我没记错的话,您只需要查找最后一个值。
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)