在Python中计算字符串中的重复字符

时间:2009-06-13 19:37:41

标签: python

我想计算每个字符在字符串中重复的次数。除了比较A-Z中字符串的每个字符外,还有什么特别的方法吗? 并递增一个计数器?

更新(参考Anthony's answer):无论你建议到现在为止,我都要写26次。有更简单的方法吗?

16 个答案:

答案 0 :(得分:106)

import collections

d = collections.defaultdict(int)
for c in thestring:
    d[c] += 1

collections.defaultdict就像dict(实际上是它的子类),但是当找到一个条目而没有找到它时,它会生成它并插入它而不是报告它通过调用提供的0参数可调用。最受欢迎的是defaultdict(int),用于计数(或者,等效地,用于制作多重编辑AKA包数据结构)和defaultdict(list),它永远不需要使用.setdefault(akey, []).append(avalue)和类似的笨拙成语。

所以一旦你完成了这个d是一个类似于字典的容器,它将每个角色映射到它出现的次数,当然你可以以任何你喜欢的方式发出它。例如,最受欢迎的角色首先:

for c in sorted(d, key=d.get, reverse=True):
  print '%s %6d' % (c, d[c])

答案 1 :(得分:32)

我的第一个想法是这样做:

chars = "abcdefghijklmnopqrstuvwxyz"
check_string = "i am checking this string to see how many times each character appears"

for char in chars:
  count = check_string.count(char)
  if count > 1:
    print char, count

然而,这不是一个好主意!这将扫描字符串26次,因此您可能会比其他一些答案多做26倍的工作。你真的应该这样做:

count = {}
for s in check_string:
  if count.has_key(s):
    count[s] += 1
  else:
    count[s] = 1

for key in count:
  if count[key] > 1:
    print key, count[key]

这可确保您只通过字符串一次,而不是26次。

另外,Alex的回答很棒 - 我对收藏模块并不熟悉。我将来会用它。他的答案比我的更简洁,技术更优越。我建议使用他的代码。

答案 2 :(得分:31)

Python 2.7+包含collections.Counter类:

import collections
results = collections.Counter(the_string)
print(results)

答案 3 :(得分:13)

这是我可以提出的最短,最实用的,无需导入额外的模块。

text = "hello cruel world. This is a sample text"
d = dict.fromkeys(text, 0)
for c in text: d[c] += 1

print d ['a']将输出2

它也很快。

答案 4 :(得分:3)

您想使用dict

#!/usr/bin/env python

input = "this is a string"

d = {}

for c in input:
    try:
        d[c] += 1
    except:
        d[c] = 1

for k in d.keys():
    print "%s: %d" % (k, d[k])

答案 5 :(得分:3)

如果有人在没有collections模块的情况下寻找最简单的方法。我想这会有所帮助:

>>> s = "asldaksldkalskdla"
>>> {i:s.count(i) for i in set(s)}
{'a': 4, 'd': 3, 'k': 3, 's': 3, 'l': 4}

>>> [(i,s.count(i)) for i in set(s)]
[('a', 4), ('k', 3), ('s', 3), ('l', 4), ('d', 3)]

答案 6 :(得分:2)

您可以使用字典:

s = "asldaksldkalskdla"
dict = {}
for letter in s:
 if letter not in dict.keys():
  dict[letter] = 1
 else:
  dict[letter] += 1

print dict

答案 7 :(得分:2)

如果我回答一些愚蠢的话,我可以算一下我在双手上认识Python的天数,请原谅我。)

我没有使用dict,而是想为什么不使用列表呢?我不确定如何在Python中实现列表和字典,因此必须对其进行测量以了解更快的内容。

如果这是C ++,我会使用普通的c-array / vector进行持续时间访问(肯定会更快)但我不知道Python中对应的数据类型是什么(如果有的话......) :

count = [0 for i in range(26)]

for c in ''.join(s.lower().split()): # get rid of whitespaces and capital letters
    count[ord(c) - 97] += 1          # ord('a') == 97

也可以制作列表的大小ord('z'),然后在任何地方删除97减法,但如果你优化,为什么不一直:)

编辑: 一位意见提供者建议加入/拆分不值得使用列表,所以我想为什么不摆脱它:

count = [0 for i in range(26)]

for c in s:
    if c.isalpha(): count[ord(c.lower()) - 97] += 1

答案 8 :(得分:1)

dict = {}
for i in set(str):
    b = str.count(i, 0, len(str))
    dict[i] = b
print dict

如果我的字符串是:

str = "this is string!"

以上代码将打印:

{'!': 1, ' ': 2, 'g': 1, 'i': 3, 'h': 1, 'n': 1, 's': 3, 'r': 1, 't': 2}

答案 9 :(得分:1)

这将显示出现次数为

的字符的字典
str = 'aabcdefghijklmnopqrstuvwxyz'
mydict = {}
for char in str:
    mydict[char]=mydict.get(char,0)+1
 print mydict

答案 10 :(得分:1)

inputString =  input("Enter a String:")
countedArray = {}

for char in inputString:
    if char in countedArray:  
        countedArray[char] += 1    
    else:
        countedArray[char] = 1
    
print(countedArray) 

答案 11 :(得分:0)

这是解决方案..

my_list=[]
history=""
history_count=0
my_str="happppyyyy"


for letter in my_str:
    if letter in history:
        my_list.remove((history,history_count))
        history=letter
        history_count+=1

    else:
        history_count=0
        history_count+=1
        history=letter


my_list.append((history,history_count))    


print my_list

答案 12 :(得分:0)

如果只计算给定字符串中给定字符的重复次数,请尝试这样的事情。

word = "babulibobablingo"
letter = 'b'

if letter in word:
    print(word.count(letter))

答案 13 :(得分:0)

s = 'today is sunday i would like to relax'
numberOfDuplicatedChar = len(s) - len(set(s))

set中没有重复的元素。

答案 14 :(得分:-1)

下面的代码对我有用,无需查找任何其他Python库。

int padding = 10;

SpannableString spannable = new SpnnableString("...");
spannable.setSpan(
        new MyLineBackgroundSpan(ContextCompat.getColor(context, R.color.colorPrimaryDark), padding),
        0, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

textView.setShadowLayer(padding, 0, 0, 0);
textView.setPadding(padding, padding, padding, padding);
textView.setText(spannable);

输出:

def count_repeated_letter(string1):
    list1=[]

    for letter in string1:
        if string1.count(letter)>=2:
            if letter not in list1:
                list1.append(letter)


    for item in list1:
        if item!= " ":
            print(item,string1.count(item))


count_repeated_letter('letter has 1 e and 2 e and 1 t and two t')

答案 15 :(得分:-1)

要计算字符串中的字符,您必须使用YOUR_VARİABLE.count('WHAT_YOU_WANT_TO_COUNT')

如果需要汇总,则必须使用count()函数。

variable = 'turkiye'
print(variable.count('u'))

输出:     1