如何在Python中快速将列表中的字母计数分配给变量

如何在Python中快速将列表中的字母计数分配给变量,python,variables,python-3.x,count,Python,Variables,Python 3.x,Count,基本上,我有一个(出于所有目的)随机字母的列表。这些字母并不是随机的,它们确实有意义;然而,这对于这个问题来说并不重要。列表如下所示: list = ['v', 'f', 't', 'w', 'w', 'i', 'b'] 真正的列表要长得多(最多100个字符)。我想计算每个字母出现的次数,并将其分配给一个变量,即该字母。例如: a = list.count('a') b = list.count('b') c = list.count('c') ... ... z = list.count('

基本上,我有一个(出于所有目的)随机字母的列表。这些字母并不是随机的,它们确实有意义;然而,这对于这个问题来说并不重要。列表如下所示:

list = ['v', 'f', 't', 'w', 'w', 'i', 'b']
真正的列表要长得多(最多100个字符)。我想计算每个字母出现的次数,并将其分配给一个变量,即该字母。例如:

a = list.count('a')
b = list.count('b')
c = list.count('c')
...
...
z = list.count('z')
我只是想知道是否有一个更简单的方法来做这件事,而不是键入同一行26次。我正在运行Python 3.4。我希望能够做到尽可能少的行数和字符数。任何建议都会很有帮助,谢谢。

简单方法#1 略为奇特的方法#2 现在
d
将包含类似以下内容:

{
  'a': 2,
  'b': 3,
  'c': 0,
  ...
} 

counts['a']
a
的出现次数。对于长度
L
N
可能不同的项目列表,这将在
O(L)
时间内运行,而不是
O(NL)
a
列表。基于计数的解决方案将采用,并且代码更少。

此方法使用字典为每个字母分配计数,而不是使用实际的字母本身

from collections import Counter
import string

dictionary = dict(Counter(l))

>>> dictionary
{'b': 1, 'f': 1, 'i': 1, 't': 1, 'v': 1, 'w': 2}

>>> dictionary['w']
2
如果您需要每个字母的完整词典,可以按如下方式扩展:

letters = string.ascii_lowercase
dictionary.update({c: 0 for c in letters if c not in dictionary})

>>>> dictionary
{'a': 0,
 'b': 1,
 'c': 0,
 'd': 0,
 'e': 0,
 'f': 1,
 'g': 0,
 'h': 0,
 'i': 1,
 'j': 0,
 'k': 0,
 'l': 0,
 'm': 0,
 'n': 0,
 'o': 0,
 'p': 0,
 'q': 0,
 'r': 0,
 's': 0,
 't': 1,
 'u': 0,
 'v': 1,
 'w': 2,
 'x': 0,
 'y': 0,
 'z': 0}

或者,您可以简单地使用字母\u count=dictionary.get(字母,0)在原始字典中为任何不在字典中的字母返回零。

这是一种无需导入的方法。既然你说你期望最多100个字符,这仍然是一个很小的集合,我就不担心计算复杂度的开销了

list(set(zip(l,[l.count(x) for x in l])))

您真的不应该对这些计数使用单独的变量。当需要在运行时确定某个字母的计数时,会发生什么情况<代码>如果字母='a':返回一个elif字母=='b':返回b elif字母=='c':返回c..
。最好使用dict之类的东西。如果出于某种原因需要dict而不是计数器,那么可以将其编写得更简单,如
d=dict(Counter(l))
。@user2357112取决于。。。如果一个字母不存在,
计数器将返回
0
,我想这可能是正确的,而不是
KeyError
“是的。。。仔细查看OPs要求,字典['a']
应该返回
0
,而不是强制执行
dict.get
KeyError
…不明确。。。(“我想计算每个字母出现的次数,并将其分配给该字母的变量”)。不管怎样,我更新了一个方法来扩展字典。@Alexander不是真的。。。如果他们将同一行输入26次,那么每个名称都将被分配一个值,即使它是
0
(例如,没有丢失的名称/键),这是可行的,但养成这样计算计数的习惯是个坏主意。当不同的可能列表项的数量增加时,这种解决方案需要很长的时间才能完成。他的问题专门询问
a-z
范围内的每个字符的计数,因此这种解决方案非常符合要求。它现在起作用了,但是,仅仅因为参数不是很大,就养成使用渐近复杂度很低的解的习惯是不好的,特别是当复杂度较高的解同样简单或编写起来更简单时。这是一种显而易见的方法。
from collections import Counter
import string

dictionary = dict(Counter(l))

>>> dictionary
{'b': 1, 'f': 1, 'i': 1, 't': 1, 'v': 1, 'w': 2}

>>> dictionary['w']
2
letters = string.ascii_lowercase
dictionary.update({c: 0 for c in letters if c not in dictionary})

>>>> dictionary
{'a': 0,
 'b': 1,
 'c': 0,
 'd': 0,
 'e': 0,
 'f': 1,
 'g': 0,
 'h': 0,
 'i': 1,
 'j': 0,
 'k': 0,
 'l': 0,
 'm': 0,
 'n': 0,
 'o': 0,
 'p': 0,
 'q': 0,
 'r': 0,
 's': 0,
 't': 1,
 'u': 0,
 'v': 1,
 'w': 2,
 'x': 0,
 'y': 0,
 'z': 0}
list(set(zip(l,[l.count(x) for x in l])))