1

我创建了一个字典字典:

from collections import defaultdict
d = defaultdict(dict)

现在我有一些字符串(让我们称之为 set A),它们有一个字符串字典(作为键)和整数(作为值)与之对应。所以上面的数据结构完全建模了这个数据。

现在我想检查A字典中是否存在与 key in 对应的字符串。如果它不存在,我想添加它并制作它的计数器1。如果它已经存在,我想增加计数器。

有没有pythonic方法可以做到这一点?

4

2 回答 2

4

如果你有嵌套的密钥dict,你可以使用一个简单的in测试:

if somestring in d[key]:
    d[key][somestring] += 1
else:
    d[key][somestring] = 1

但你可以使用 aCounter代替:

from collections import defaultdict, Counter
d = defaultdict(Counter)

d[key][somestring] += 1

与 a 一样defaultdict,aCounter为缺少的键提供默认值,默认为0.

柜台还有其他好处;与其循环遍历一组字符串并手动增加这些字符串的计数器,不如将整个序列传递给.update()适当计数器的方法:

d[key].update(sequence_of_strings)

并且Counter将为您计算所有这些。

该类Counter是其他语言可能称为 Multi-Set 或 Bag 类型的东西。它们也支持有趣的比较和算术运算,请确保您阅读了该类型的文档。

于 2013-04-07T10:22:56.887 回答
1

正如 Lev Levitsky 指出的那样,您想要的是使用Counter. 例如,假设您有以下字符串:

>>> the_strings = [
...     ('a', ('the', 'strings', 'in', 'the', 'dict')),
...     ('b', ('other', 'strings', 'in', 'the', 'dict', 'in', 'your', 'question'))
... ]

你想将'a'一个字典与那个单词的计数相关联,你可以这样做:

>>> my_dict = defaultdict(Counter)
>>> for key, strings in the_strings:
...     my_dict[key].update(strings)
... 
>>> my_dict['a']['the']
2
>>> my_dict['b']['in']
2
>>> my_dict['b']['question']
1

如果你想增加一个值,你可以简单地做:

>>> my_dict[the_string][the_word] += 1

或者您可以使用以下方法自动增加迭代中每个元素的计数update

>>> my_dict[the_string].update(iterable_of_elements)
于 2013-04-07T10:30:14.990 回答