我想写一个函数,它返回在输入字符串中多次出现的字母字符数和数字。
示例示例:“aabbccd”应返回3,因为“a”,“b”和“c”都有重复项。 “aaabbccd”也是如此,也会返回3。
这是我做的,但似乎我的代码有问题。它适用于某些情况,但显然不适用于其他情况。
def duplicate_count(text):
count=0
for i in range(len(text)-1):
for j in range(i+1,len(text)):
if text[i]==text[j]:
count+=1
break
break
return count
答案 0 :(得分:1)
这个会更简洁:
import numpy as np
def duplicate_count(text):
#elem is an array of the unique elements in a string
#and count is its corresponding frequency
elem, count = np.unique(tuple(text), return_counts=True)
return np.sum(count>1)
答案 1 :(得分:1)
问题是你没有跟踪你已经计算过的信件。
考虑输入aaa
。代码采用第一个a
并搜索另一个a
。它找到一个,所以它递增count
。然后代码移到第二个a
。它会搜索另一个a
(再次),找到一个,然后递增count
(再次)。
使用一组来跟踪您已经计算过的字母。
答案 2 :(得分:1)
一种简单的方法是:
def duplicate_count(s):
return len([x for x in set(s) if s.count(x) > 1])
答案 3 :(得分:1)
这是一种原生方法,在纯O(N)时间内没有诉诸昂贵的str.count()
(虽然性能取决于字符串的长度和重复的字符):
def duplicate_count(text):
seen = set()
return len({char for char in text if char in seen or seen.add(char) is not None})
print(duplicate_count("aabbccd"))
# 3
答案 4 :(得分:0)
这是一种使用dict的方法。
import collections
your_string='aabbssesd'
d = collections.defaultdict(int)
for c in your_string:
d[c] += 1
d = {k: v for k, v in d.items() if v>1}
print(len(d))
defaultdict只会创建您尝试访问的任何项目(前提是它们尚不存在)。
d = collections.defaultdict(int)
这将为字符串中出现的字符数输出一个键值对,如<。p>
{'e': 1, 'a': 2, 'r': 1, 's': 2}
使用dict comprehension仅存储来自dict的键k,值v对以及值v是否大于1.(多于一次出现)
d = {k: v for k, v in d.items() if v>1}
这是输出
{'a': 2, 's': 2}
然后print(len(d))
获取重复数量
答案 5 :(得分:0)
另一个单行解决方案:
import collections
def duplicate_count(text):
return len(list(filter(lambda x:x[1]>1,collections.Counter(text).items())))