我想在列表中找到重复的字符,但是它们应该是并排的。
例如:
lst = ["A", "B", "B", "A"]
我想检测"B"
,而不是"A"
。如果没有并排的重复字符,我的程序将打印一条消息并完成游戏。我该如何实现?
编辑:感谢所有评论,它们都是真实的。我只需要查找“ -X-”是否重复,并通过将列表转换为字符串来完成。再次感谢大家!
答案 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
答案 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