【问题标题】:Python Counter in dict vs list in dict probability of choosing an elementdict中的Python计数器与dict中的列表选择元素的概率
【发布时间】:2018-01-18 20:41:56
【问题描述】:

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

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

我在这个例子中使用namedtuple。存储的值 48 - 四倍 52 - 双倍?

让我们用字典中的列表来做这个:

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

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

我想知道带有计数器的 dic 的提取物给我{48: {48,48,48,48}, {52,52}} 还是 Counter 只存储元素数量?

真正的问题是: 我应该使用哪种方式从键中获取随机值?带列表的字典还是带计数器的字典?一样的?

我使用马尔可夫链来生成音乐。我有一套笔记,我建立了一本字典。

【问题讨论】:

  • 我不确定我是否理解这个问题 - 每个示例中的概率都是相同的。真正的问题是什么?是关于构造字典,还是关于从值中提取随机条目?
  • 我想知道带有 Counter 的 dict 中的元素是如何存储的 我更新了我的问题。

标签: python dictionary


【解决方案1】:

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

如果您使用的是random.choice,那么您希望将字典与列表值一起使用。这是因为当您对 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))

【讨论】:

  • random.choices 选择Counter上下文中所有值的键?
  • 我的意思是值的总和,例如。 num of 42 eq 4 so weight od 42 is 4
  • @lukassz 是的。更准确地说,choices 可以按顺序采用两个位置参数populationweightspopulation[i] 处的元素的权重为 weights[i]。我们正在处理counts.items(),以便每个键值对最终位于populationweights 中的相同索引处。
  • 我认为 weights 的总和必须为 1。我如何计算此集合的 weights {48: ['48','48','48','48','52','52']} (48,52)?
  • choices 使用相对权重,因此它们的总和不必为 1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-09
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多