如何访问嵌套的理解列表

时间:2013-05-04 18:33:04

标签: python list-comprehension

我有一个工作解决方案,用于创建一些随机数列表,计算它们的出现次数,并将结果放在一个字典中,该字典看起来如下:

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。

3 个答案:

答案 0 :(得分: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})

答案 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)

列表中使用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})