我有一个工作解决方案,用于创建一些随机数列表,计算它们的出现次数,并将结果放在一个字典中,该字典看起来如下:
random_ints = [random.randint(0,4) for _ in range(6)]
dic = {x:random_ints.count(x) for x in set(random_ints)])
所以,因为,[0,2,1,2,1,4]我得到{0:1,1:2,2:2,4:1}
我想知道是否有可能在单行中表达它,最好不使用库函数 - 我想看看python有什么可能:) 当我尝试将两行合并为一行时,我不知道如何表达对同一理解的random_ints列表的两个引用.. ???我期待的是:
dic = {x:random_ints.count(x) for x in set([random.randint(0,4) for _ in range(6)] as random_ints))
当然不起作用......
我在SO上查看(嵌套)列表推导,但是我无法将我找到的解决方案应用到我的问题中。
谢谢,s。
答案 0 :(得分:2)
这是一个依赖random
和collections
模块的单线程。
>>> import collections
>>> import random
>>> c = collections.Counter(random.randint(0, 6) for _ in range(100))
>>> c
Counter({2: 17, 1: 16, 0: 14, 3: 14, 4: 14, 5: 13, 6: 12})
答案 1 :(得分:2)
有几种方法可以实现这样的目标,但它们都不是你想要的。你不能做的是简单地将名称绑定到list / dict理解中的固定值。如果random_ints
不依赖dic
所需的任何迭代变量,最好按照您的方式执行,并分别创建random_ints
。
从概念上讲,dict理解中唯一应该包含的内容是需要为dict中的每个项目单独创建的内容。 random_ints
不符合此标准;你只需要一个random_ints
整体,所以没有理由把它放在dict理解中。
那说,一种方法是通过迭代包含random_ints
的单元素列表来伪造它:
{x:random_ints.count(x) for random_ints in [[random.randint(0,4) for _ in range(6)]] for x in set(random_ints)}
答案 2 :(得分:1)
在列表中使用 dict-comprehension将不起作用。as
试试这个:
dic = {x:random_ints.count(x)
for random_ints in ([random.randint(0,4) for _ in range(6)],)
for x in set(random_ints))
我认为使用collections.Counter
是一个更好的主意:
>>> import collections, random
>>> c = collections.Counter(random.randint(0, 6) for _ in range(6))
>>> c
Counter({6: 3, 0: 1, 3: 1, 4: 1})