![](/img/trans.png)
[英]Given a string, find out the highest repeated characters count in 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.