繁体   English   中英

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

[英]Find count of characters within the string in Python

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

str1 = "aabbaba"

我想创建一个这样的字典

word_count = {'a':4,'b':3}

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

dic = {x:dic[x]+1 if x in dic.keys() else x:1 for x in str}

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

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

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

这样做的理想方法是使用collections.Counter

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

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

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

你也可以这样做:

>>> {e:str1.count(e) for e in set(str1)}
{'a': 4, 'b': 3}

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

如果你不想要导入的版本比使用更高效的.count ,你可以使用.setdefault提出抗辩:

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

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


如果您愿意,也可以使用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}

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

这是collections.Counter一个很好的案例:

>>> from collections import Counter
>>> Counter(str1)
Counter({'a': 4, 'b': 3})

它是dict子类,因此您可以使用类似于标准字典的对象:

>>> c = Counter(str1)
>>> c['a']
4

您也可以在不使用Counter类的情况下执行此操作。 这个简单而有效的python代码是:

>>> d = {}
>>> for x in str1:
...     d[x] = d.get(x, 0) + 1
... 
>>> d
{'a': 4, 'b': 3}

请注意,这不是正确的方法,因为它不会多次计算重复的字符(除了丢失原始字典中的其他字符),但这回答了原理问题,即在理解中是否有可能并且演示怎么做

要回答你的问题,是的,这是可能的,但方法是这样的:

dic = {x: (dic[x] + 1 if x in dic else 1) for x in str1}

条件仅应用于值:值映射。

使用dict.get可以使上面的内容更清晰:

dic = {x: dic.get(x, 0) + 1 for x in str1}

如果x不在dic则返回0。

演示:

In [78]: s = "abcde"

In [79]: dic = {}

In [80]: dic = {x: (dic[x] + 1 if x in dic else 1) for x in s}

In [81]: dic 
Out[81]: {'a': 1, 'b': 1, 'c': 1, 'd': 1, 'e': 1}

In [82]: s = "abfg"

In [83]: dic = {x: dic.get(x, 0) + 1 for x in s}

In [84]: dic
Out[84]: {'a': 2, 'b': 2, 'f': 1, 'g': 1}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM