我如何只检测列表中的重复元素?

时间:2016-11-07 02:21:41

标签: python

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

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

应该只找到15不应该。{/ p>

3 个答案:

答案 0 :(得分:2)

如果必须找到连续的重复值,我会使用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]

答案 1 :(得分:1)

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

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
]

请注意,如果连续多次出现重复项,则这些副本都会多次附加重复项。

答案 2 :(得分:0)

要查找相邻的副本,您可以遍历项目列表并将当前项目与下一项目进行比较。

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]