我正在用python处理单词,我想看看一个字符串是否有3个或更多的相同字母背对背的出现。除了嵌套的for循环之外,还有更好的方法吗?例如:"helllooooo">
作为另一种选择,循环一次但提前检查下两个字母将工作,并且循环较小,因为您不必检查最后两个字符,并且您可以在发现匹配时立即中断:
for i in range(0, len(instring)-2):
if (instring[i] == instring[i+1] == instring[i+2]):
print(f"{instring[i]} occurs three or more times.")
break
可选地,如果需要知道这些序列在字符串中出现的值或位置,您可以生成一个列表,该列表包含开始一行三字符序列的字母的索引:
print([[i,c] for i,c in enumerate(instring) if i < len(instring)-2 and (c == instring[i+1] == instring[i+2])])
这将生成一个列表的列表,其中包含字母和在单词中找到序列3的位置。
您不需要嵌套循环-只需跟踪您看到的最后一个字符并使用计数器
def atleast3(s):
count = 0
last = None
for c in s:
if c == last:
count += 1
if count >= 3:
return True
else:
count = 1
last = c
return False
一个循环可以工作
string = 'hellooo'
res = ''
prev_item = ''
for item in string:
if item == prev_item:
res += '1'
else:
res += '0'
prev_item = item
print(res) #'0001011'
if '11' in res:
print('Yes')
else:
print('No')
可能有更好的方法(通常有)但是如果你正在寻找任何在字符串中连续重复至少n次的字符,则:
def has_repeats(s, n=3):
for i in range(len(s)-n+1):
if (a := s[i:i+n]).count(a[0]) == n:
return True
return False
print(has_repeats('helllooooo'))
输出:
True
n默认值为3。如果需要,可以重写为任何数字。
如果你正在寻找一个由3个字符组成的序列,那么这可能会更快:
def has_3_repeats(s):
for t in zip(s, s[1:], s[2:]):
if t.count(t[0]) == 3:
return True
return False
可以用正则表达式非常简洁地完成
>>> import re
>>> re.findall(r"((?P<s>[a-zA-Z0-9])(?P=s){2,})", "hellllooooooo")
[('llll', 'l'), ('ooooooo', 'o')]
有这样的工具。itertools.groupby
将根据主键(在本例中是单词中的下一个字母)中的每个更改进行分组。它的第二项是一个迭代器,将输出类似值的项(连续字母)。
>>> import itertools
>>> for letter, seq in itertools.groupby("hellloooooooo"):
... sz = len(list(seq))
... if sz >= 3:
... print(letter, sz)
...
l 3
o 8
如果您只关心查找第一个序列,则可以提前跳出循环,如
for _, seq in itertools.groupby("hellloooooooo"):
if len(list(seq)) >= 3:
has_3 = True
break
else:
has_3 = False
想法是将shift
字与比较,
首先,从给定的单词
创建Pandas系列import pandas as pd
s = pd.Series(list(w))
print(s)
0 h
1 e
2 l
3 l
4 l
5 o
6 o
7 o
8 o
9 o
dtype: object
然后你可以分组和shift
系列找到连续字符
m = s.groupby(s).filter(lambda g: g.eq(g.shift().bfill()).sum() >= 3)
print(m)
2 l
3 l
4 l
5 o
6 o
7 o
8 o
9 o
dtype: object
如果要确定重复字符和重复次数
print(m.value_counts())
o 5
l 3
dtype: int64
如果要查找重复字符的位置
i = m.groupby(m).apply(lambda g: g.iloc[[0, -1]].index.tolist()).to_dict()
print(i)
{'l': [2, 4], 'o': [5, 9]}
这是我做的一个函数,如果单词有重复的字母,它应该返回True
,如果没有,则返回False
。
def repeated_letters(word:str):
count = 0
for i in range(len(word) -1):
if word[i] == word[i+1]:
count += 1
if count == 2:
return True
else:
count = 0
return False