通过列表理解的Unspool频率表

时间:2016-07-14 01:51:03

标签: python list-comprehension

这是一个以列表形式实现的频率表。

table = [1,3,2]

所需的输出是各个值的列表。

unspooled =  [0, 1, 1, 1, 2, 2]

以下语法将完成工作。

sum((freq*[score] for score, freq in enumerate(table)), []) 

然而,作为一种测试我的理解的练习,我想知道是否有一种方法可以通过纯列表理解来实现这一点。谢谢。

(或者其次,如果有这样做的方式比我所拥有的更具表现力,那就不是纯粹的列表理解,我也可以这样做。)

PS显然,我的语法产生terrible performance

更新。所有建议解决方案的计时。

In [9]: table
Out[9]: range(0, 1000)

In [10]: %timeit [i for i, x in enumerate(table) for _ in range(x)]
10 loops, best of 3: 27.1 ms per loop

In [11]: %timeit [ind for ind in range(len(table)) for val in range(table[ind])]
10 loops, best of 3: 27 ms per loop

In [12]: %timeit reduce( lambda x,y:x+y, [ [i]*frq for i,frq in enumerate(table)] )
1 loop, best of 3: 1.11 s per loop

In [13]: %timeit list(itertools.chain(freq*[score] for score, freq in enumerate(table))
100 loops, best of 3: 3.84 ms per loop

3 个答案:

答案 0 :(得分:2)

我相信这会奏效:

unspooled = [ind for ind in range(len(table)) for val in range(table[ind])]

答案 1 :(得分:2)

您可以使用enumeratetable

返回索引和项目
>>> table = [1,3,2]
>>> [i for i, x in enumerate(table) for _ in range(x)]
[0, 1, 1, 1, 2, 2]

答案 2 :(得分:0)

table = [1,3,2]
res = reduce( lambda x,y:x+y, [ [i]*frq for i,frq in enumerate(table)] )

output:
[0, 1, 1, 1, 2, 2]