簡體   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