在 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 comprehension 表达式实现此目的,因为您需要引用元素计数的先前值。如 , as a work around you may use list.count(e)
in order to find count of each element from the set
of string within you dict comprehension expression 中所述。但是时间复杂度将是 n*m
,因为它将遍历每个唯一元素的完整字符串(其中 m 是唯一元素),而与计数器一样,它将是 n
.
这是 collections.Counter
的一个很好的案例:
>>> from collections import Counter
>>> Counter(str1)
Counter({'a': 4, 'b': 3})
它是 dict subclass,因此您可以像使用标准字典一样使用该对象:
>>> c = Counter(str1)
>>> c['a']
4
您也可以在不使用计数器 class 的情况下执行此操作。简单有效的 python 代码是:
>>> d = {}
>>> for x in str1:
... d[x] = d.get(x, 0) + 1
...
>>> d
{'a': 4, 'b': 3}
正如其他人所说,最好使用计数器来完成。
您还可以这样做:
>>> {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}
但是如果您要导入集合——使用计数器!
请注意,这不是正确的方法,因为它不会多次计算重复字符(除了从原始字典中丢失其他字符),但这回答了原始问题if-else 是否可以理解并演示如何完成。
要回答你的问题,是的,这是可能的,但方法是这样的:
dic = {x: (dic[x] + 1 if x in dic else 1) for x in str1}
条件仅应用于值而不应用于 key:value 映射。
以上可以使用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}
我正在尝试创建一个包含单词及其在字符串中重复次数的字典。假设字符串如下所示
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 comprehension 表达式实现此目的,因为您需要引用元素计数的先前值。如 list.count(e)
in order to find count of each element from the set
of string within you dict comprehension expression 中所述。但是时间复杂度将是 n*m
,因为它将遍历每个唯一元素的完整字符串(其中 m 是唯一元素),而与计数器一样,它将是 n
.
这是 collections.Counter
的一个很好的案例:
>>> from collections import Counter
>>> Counter(str1)
Counter({'a': 4, 'b': 3})
它是 dict subclass,因此您可以像使用标准字典一样使用该对象:
>>> c = Counter(str1)
>>> c['a']
4
您也可以在不使用计数器 class 的情况下执行此操作。简单有效的 python 代码是:
>>> d = {}
>>> for x in str1:
... d[x] = d.get(x, 0) + 1
...
>>> d
{'a': 4, 'b': 3}
正如其他人所说,最好使用计数器来完成。
您还可以这样做:
>>> {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}
但是如果您要导入集合——使用计数器!
请注意,这不是正确的方法,因为它不会多次计算重复字符(除了从原始字典中丢失其他字符),但这回答了原始问题if-else 是否可以理解并演示如何完成。
要回答你的问题,是的,这是可能的,但方法是这样的:
dic = {x: (dic[x] + 1 if x in dic else 1) for x in str1}
条件仅应用于值而不应用于 key:value 映射。
以上可以使用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}