【问题标题】:How to form a dictionary from a string?如何从字符串形成字典?
【发布时间】:2015-03-26 10:38:22
【问题描述】:
word = 'stacks' 
word_dict = {} # to form new dictionary formed from
for letter in word:
    word_dict[letter] += 1
print word_dict

我想从一个字符串创建一个新字典,跟踪来自word 的字母计数。所以我想要得到的是:

> word_dict = {'s':2, 't':1, 'a':1, 'c':1, 'k':1}

但我不知道该怎么做。我用我当前的代码得到KeyError

【问题讨论】:

标签: python for-loop dictionary


【解决方案1】:

请改用collections.Counter() class

from collections import Counter

word_dict = Counter(word)

Counter 做同样的事情;计算word 中每个字母的出现次数。

在您的特定情况下,您没有首先检查密钥是否已经存在,或者如果不存在则提供默认值。你可以使用dict.get() 来做到这一点:

word = 'stacks' 
word_dict = {} # to form new dictionary formed from
for letter in word:
    word_dict[letter] = word_dict.get(letter, 0) + 1
print word_dict

或单独使用dict.setdefault() 在递增之前显式设置默认值:

word = 'stacks' 
word_dict = {} # to form new dictionary formed from
for letter in word:
    word_dict.setdefault(letter, 0)
    word_dict[letter] += 1
print word_dict

或自己测试密钥:

word = 'stacks' 
word_dict = {} # to form new dictionary formed from
for letter in word:
    if letter not in word_dict:
        word_dict[letter] = 0
    word_dict[letter] += 1
print word_dict

按效率降序排列。

或者您可以使用collections.defaultdict() object 自动插入0(如果密钥尚不存在):

from collections import defaultdict

word_dict = defaultdict(int)
for letter in word:
    word_dict[letter] += 1
print word_dict

这基本上是 Counter 类所做的,但该类型增加了一些其他细节,例如列出最常用的键或组合计数器。

演示:

>>> from collections import defaultdict, Counter
>>> word = 'stacks' 
>>> word_dict = {} # to form new dictionary formed from
>>> for letter in word:
...     word_dict[letter] = word_dict.get(letter, 0) + 1
... 
>>> word_dict
{'a': 1, 'c': 1, 's': 2, 't': 1, 'k': 1}
>>> word_dict = defaultdict(int)
>>> for letter in word:
...     word_dict[letter] += 1
... 
>>> word_dict
defaultdict(<type 'int'>, {'a': 1, 'c': 1, 's': 2, 't': 1, 'k': 1})
>>> Counter(word)
Counter({'s': 2, 'a': 1, 'c': 1, 't': 1, 'k': 1})

【讨论】:

  • 是否可以在 for 循环中执行此操作?我刚开始学习Python
  • @AlanH:我在这里为你介绍了所有的基础。
  • 非常感谢。这真的很有帮助。
  • 还有word_dict.setdefault(letter, 0)
  • @PadraicCunningham:我在dict.setdefault() 中添加了一个明确的关键测试用例。
【解决方案2】:

试试这个

from collections import Counter
>>>Counter(word)
Counter({'s': 2, 'a': 1, 'c': 1, 't': 1, 'k': 1})

【讨论】:

  • 应该是from collections import Counter
  • 对我们伟大的 packages 感到困惑 :)
猜你喜欢
  • 2011-09-09
  • 2011-01-13
  • 2015-07-20
  • 2015-02-02
  • 2021-07-07
  • 2022-11-10
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
相关资源
最近更新 更多