Python - 查找字符串文本中的重复项数

时间:2017-06-10 23:31:42

标签: python string text count duplicates

我想写一个函数,它返回在输入字符串中多次出现的字母字符数和数字。

示例示例:“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

6 个答案:

答案 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())))