我正在尝试获取一个单词中重复多少个字符。重复必须是连续的。
例如,输入“ loooooveee”的方法应返回6(“ o”的4倍,“ e”的2倍)。
我正在尝试实现字符串级函数,我可以通过这种方式做到这一点,但是,有一种简单的方法吗?正则表达式或其他类型的东西?
到目前为止,我已经尝试过:
def measure_normalized_emphasis(text):
char = text[-1]
emphasis_size = 0
for i in range(1, len(text)):
if text[-i] == char:
emphasis_size += 1
else:
char = text[i - 1]
return emphasis_size
它返回8并带有“ loooooveee”。
答案 0 :(得分:16)
order of repetition does not matter
您可以将唯一字母的数量减去总字母的数量。将set
应用于字符串将返回唯一的字母集合。
x = "loooooveee"
res = len(x) - len(set(x)) # 6
或者您可以使用collections.Counter
,从每个值中减去1,然后sum
:
from collections import Counter
c = Counter("loooooveee")
res = sum(i-1 for i in c.values()) # 6
repetitions must be sequential
您可以使用itertools.groupby
对连续的相同字符进行分组:
from itertools import groupby
g = groupby("aooooaooaoo")
res = sum(sum(1 for _ in j) - 1 for i, j in g) # 5
要避免嵌套的sum
调用,可以使用itertools.islice
:
from itertools import groupby, islice
g = groupby("aooooaooaoo")
res = sum(1 for _, j in g for _ in islice(j, 1, None)) # 5
答案 1 :(得分:4)
如果需要,可以使用正则表达式:
import re
rx = re.compile(r'(\w)\1+')
repeating = sum(x[1] - x[0] - 1
for m in rx.finditer("loooooveee")
for x in [m.span()])
print(repeating)
这可以正确产生6
并利用.span()
函数。
(\w)\1+
捕获单词字符(a-zA-Z0-9_
中的一个)并尝试尽可能多地重复。
有关重复模式,请参见a demo on regex101.com。
(.)\1+
答案 2 :(得分:1)
尝试一下:
word=input('something:')
sum = 0
chars=set(list(word)) #get the set of unique characters
for item in chars: #iterate over the set and output the count for each item
if word.count(char)>1:
sum+=word.count(char)
print('{}|{}'.format(item,str(word.count(char)))
print('Total:'+str(sum))
编辑:
增加了重复总数
答案 3 :(得分:1)
由于重复发生在哪里或要重复哪个字符都没有关系,因此可以使用Python中提供的set
数据结构。它将丢弃重复出现的任何字符或对象。
因此,解决方案将如下所示:
def measure_normalized_emphasis(text):
return len(text) - len(set(text))
这将为您提供准确的结果。
此外,请务必注意一些边缘情况,这是一个好习惯。
答案 4 :(得分:1)
我认为您的代码正在比较错误的内容
您首先要找到最后一个字符:
char = text[-1]
然后将其与自身进行比较:
for i in range(1, len(text)):
if text[-i] == char: #<-- surely this is test[-1] to begin with?
为什么不只通过字符:
def measure_normalized_emphasis(text):
char = text[0]
emphasis_size = 0
for i in range(1, len(text)):
if text[i] == char:
emphasis_size += 1
else:
char = text[i]
return emphasis_size
这似乎可行。