1

我有一个可行的解决方案来创建一些随机数的列表,计算它们的出现次数,并将结果放入字典中,如下所示:

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。

4

3 回答 3

2

这是一个依赖于randomcollections模块的单线。

>>> 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})
于 2013-05-04T18:38:02.673 回答
2

有几种方法可以实现这样的目标,但它们都不是你想要的。您不能做的是简单地将名称绑定到列表/字典理解中的固定值。如果random_ints不依赖于 所需的任何迭代变量dic,最好按照您的方式进行操作,并random_ints单独创建。

从概念上讲,字典理解中唯一应该包含的东西是需要为字典中的每个项目单独创建的东西。 random_ints不符合这个标准;你只需要一个random_ints整体,所以没有理由把它放在字典理解中。

也就是说,一种方法是通过迭代包含您的单元素列表来伪造它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)}
于 2013-05-04T18:40:04.410 回答
1

as列表中使用dict-comprehension 将不起作用。

尝试这个:

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})
于 2013-05-04T18:37:55.830 回答