我正在尝试从列表中检测背靠背重复项。我尝试了不同的重复检测,但我无法抓取列表并检测背对背重复。
[1,1,2,4,5,6,5]
应该只找到1
,5
不应该。{/ p>
答案 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)
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]