如何仅从列表中检测背对背的重复元素?

2024-06-16 10:46:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从列表中检测背对背的重复项。我尝试了不同的重复检测,但我无法在列表中爬行并检测到背对背的重复

[1,1,2,4,5,6,5]

只应找到1,不应找到5


Tags: 列表背对背
3条回答

如果必须找到连续的重复值,我将使用itertools.groupby

items = [1,1,2,4,5,6,5]

[g for g, l in itertools.groupby(items) if len(list(l)) > 1]

另一种方法是压缩列表并比较相邻值:

[e1 for e1, e2 in zip(items, items[1:]) if e1 == e2]

您可以跟踪看到的最后一个值,并且仅当它与当前值相同时才附加到新列表:

numbers = [1,1,2,4,5,6,5]
duplicates = []
previous = None
for n in numbers:
    if n == previous:
        duplicates.append(n)
    previous = n

您还可以使用zip和切片列表,在循环时查看前面的项目:

duplicates = []
for previous, item in zip(numbers, numbers[1:]):
    if previous == item:
        duplicates.append(item)

等价的list comprehension

duplicates = [
    item
    for previous, item in zip(numbers, numbers[1:]
    if previous == item
]

请注意,如果重复项在一行中出现多次,则这两个项都会多次追加重复项

要找到相邻的重复项,您可以遍历项目列表并将当前项目与下一个项目进行比较

items = [1, 1, 2, 4, 5, 6, 5]

for i, item in enumerate(items):
    # don't compare last item to avoid going out of range
    if i < len(items) - 1:
         if item == items[i + 1]:
             print 'duplicate found', item, items[i + 1]

这可以通过从循环中删除最后一项来进一步优化。这就避免了需要做if检查以确保我们不在最后一项上

items = [1, 1, 2, 4, 5, 6, 5]

for i, item in enumerate(items[:-1]):
    if item == items[i + 1]:
         print 'duplicate found', item, items[i + 1]

相关问题 更多 >