如何在列表中找到重复项?

时间:2018-12-20 17:55:24

标签: python python-3.x list

我想在列表中找到重复的字符,但是它们应该是并排的。

例如:

lst = ["A", "B", "B", "A"]

我想检测"B",而不是"A"。如果没有并排的重复字符,我的程序将打印一条消息并完成游戏。我该如何实现?

编辑:感谢所有评论,它们都是真实的。我只需要查找“ -X-”是否重复,并通过将列表转换为字符串来完成。再次感谢大家!

5 个答案:

答案 0 :(得分:3)

如果您只想知道两个并排的元素是否相等,则可以:

def any_side_by_side(l):
    return any(first == second for first, second in zip(l, l[1:]))


print(any_side_by_side(['A', 'B', 'B', 'A']))
print(any_side_by_side(['B', 'A', 'B', 'A']))

输出

True
False

答案 1 :(得分:2)

您可以使用itertools.groupby

from itertools import groupby 

def any_side_by_side(iterable): 
     for k, group in groupby(iterable): 
         next(group) # discard first group element
         try: 
             next(group) # is there a second element?
             return True 
         except StopIteration: 
             pass 
     return False

一种较短但内存效率较低的方法是

any(len(list(group)) > 1 for k, group in groupby(iterable))

演示:

>>> any_side_by_side(['A', 'B', 'B', 'A'])                                                                             
True
>>> any_side_by_side(['B', 'A', 'B', 'A'])                                                                             
False

如果列表中有重复的元素序列,则上述函数将返回True,否则返回False

另一个选择是pairwise文档中的itertools recipe。您可以复制粘贴或从more_itertools导入它。

>>> from more_itertools import pairwise                                                                                
>>>                                                                                                                    
>>> any(x == y for x,y in pairwise(['A', 'B', 'B', 'A']))                                                              
True
>>> any(x == y for x,y in pairwise(['B', 'A', 'B', 'A']))                                                              
False

这两种解决方案都适用于任何可迭代的方法,而不仅仅是列表。他们也不会在内存中创建不需要的中介列表。

答案 2 :(得分:2)

使用numpy,您可以将列表元素与每个列表项的下一个元素进行比较。

import numpy as np

any(np.where(np.asarray(lst[1:]) == np.asarray(lst[:-1])))

lst[1:]代表列表中的下一项。在您的示例中,lst[1:]将是["B", "B", "A"]。由于最后一项没有邻居,lst[:-1]获得除最后一项(["A", "B", "B"])以外的所有元素。上面的代码比较了这两个数组以查找匹配项。如果找到任何匹配项,则代码将评估True,表示至少有一对重复值,否则它将评估False

答案 3 :(得分:2)

我们可以循环检查最后一个值是否与当前值相同

lst = ["A", "B", "B", "A"]
tmp = ""
dup = ""
for x in lst:
    if x == tmp:
        print("Side by side value detected" + x)
    else:
        for s in dup.split(","):
            if s == x:
                print("Duplicate but not side by side "+ x)
        dup = dup + "," + x
    tmp = x

如果要打印不相似的并排值,则可以写其他情况 enter image description here

答案 4 :(得分:1)

使用pandas软件包对解决此问题非常有用。

您首先从列表中定义一个Series,然后创建一个班次并与原始班次进行比较。如果以后是否有任何重复项,甚至有重复的字符串,最终都可以得到结果。

import pandas as pd
lst = ["A", "B", "B", "A"]
df = pd.Series(lst)
check = df.eq(df.shift())

然后,您可以使用以下方法获取布尔值说明:

>> check.any()
True

您甚至可以通过以下方式获取哪些值是后续重复项:

>> df[check]
2    B