在Python中查找字符串中的字符数

Chi*_*raj 7 python string counter dictionary dictionary-comprehension

我正在尝试创建一个单词字典和它在字符串中重复的次数.假设字符串如下所示

str1 = "aabbaba"
Run Code Online (Sandbox Code Playgroud)

我想创建一个这样的字典

word_count = {'a':4,'b':3}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用字典理解来做到这一点.我做到了

dic = {x:dic[x]+1 if x in dic.keys() else x:1 for x in str}
Run Code Online (Sandbox Code Playgroud)

这最终会给出一个错误说法

  File "<stdin>", line 1
    dic = {x:dic[x]+1 if x in dic.keys() else x:1 for x in str}
                                               ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

谁能告诉我语法有什么问题?另外,如何使用字典理解创建这样的字典?

daw*_*awg 7

正如其他人所说,这最好用一个柜台来完成.

你也可以这样做:

>>> {e:str1.count(e) for e in set(str1)}
{'a': 4, 'b': 3}
Run Code Online (Sandbox Code Playgroud)

但是,对于每个唯一字符遍历字符串1 + n次(一次创建集合,并且每个唯一字母一次计算它出现的次数.即,这具有二次运行时复杂性.).如果长字符串中有很多唯一字符,则结果不好...计数器只遍历字符串一次.

如果您不想使用比使用更高效的导入版本.count,您可以使用.setdefault制作计数器:

>>> count={}
>>> for c in str1:
...    count[c]=count.setdefault(c, 0)+1
... 
>>> count
{'a': 4, 'b': 3}
Run Code Online (Sandbox Code Playgroud)

无论多长时间或多少个唯一字符,它只会遍历字符串一次.


defaultdict如果您愿意,也可以使用:

>>> from collections import defaultdict
>>> count=defaultdict(int)
>>> for c in str1:
...    count[c]+=1
... 
>>> count
defaultdict(<type 'int'>, {'a': 4, 'b': 3})
>>> dict(count)
{'a': 4, 'b': 3}
Run Code Online (Sandbox Code Playgroud)

但是如果要导入集合 - 使用计数器!


Moi*_*dri 6

理想的方法是使用collections.Counter:

>>> from collections import Counter
>>> str1 = "aabbaba"
>>> Counter(str1)
Counter({'a': 4, 'b': 3})
Run Code Online (Sandbox Code Playgroud)

您无法通过简单的dict理解表达式实现此目的,因为您需要引用先前的元素计数值.正如Dawg的回答中所提到,作为一种解决方法你可能会使用list.count(e)以便从set你的字符串中找到每个元素的数量dict理解表达式.但是时间的复杂性将是n*m因为它将遍历每个唯一元素的完整字符串(其中m是唯一元素),其中与计数器一样n.