这是一个以列表形式实现的频率表。
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
答案 0 :(得分:2)
我相信这会奏效:
unspooled = [ind for ind in range(len(table)) for val in range(table[ind])]
答案 1 :(得分:2)
您可以使用enumerate
从table
:
>>> 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]