dict中的Python计数器与选择元素的dict概率中的列表

时间:2018-01-18 20:41:56

标签: python dictionary

我对Counter有一个python词典的问题。我使用Counter构建字典(它帮助我构建邻接矩阵)

{48: {Note(note=48, duration=200): 4, Note(note=52, duration=200): 2}}

我在此示例中使用namedtuple。存储的值为48 - 四倍  52 - 双倍?

让我们用dict中的list:

{48: ['48','48','48','48','52','52']}

现在我将从给定键中选择一个随机值(48)。字典中的列表和带计数器的字典的概率是多少?用字典中的列表做这个更好吗?这有关系吗?

我想知道带有计数器的dic的提取物给我{48: {48,48,48,48}, {52,52}}或者仅计数器存储了元素的数量?

真正的问题是: 我应该用哪种方式从密钥中获取随机值? Dict与列表或Dict与计数器?一样的?

我担心马尔可夫链会产生音乐。我有一套笔记,我建了一本字典。

1 个答案:

答案 0 :(得分:2)

这取决于您如何随机选择元素。

如果您正在使用random.choice,那么您希望将dict与列表值一起使用。这是因为当您遍历Counter时,您只会遍历密钥,因此random.choice(some_counter)会对some_counter的所有密钥进行均等加权。

如果您使用的是Python> = 3.6,则可以使用新的random.choices来选择使用其值作为权重的键

from random import choices 
from collections import Counter

counts = Counter('Some input iterable')

print(choices(*zip(*counts.items())))
# This gives us a list containing one randomly selected key of counts
# ['e'] for example
# If you want more, you can specify a keyword argument k equal to the number of elements
#   you  want to select form the population (with replacement)

choices(*zip(*counts.items()))是做

之类的简短方法
keys = []
values = []
for key, value in counts.items():
    keys.append(key)
    values.append(value)
print(choices(keys, values))