通过列表理解取消假脱机频率表
Posted
技术标签:
【中文标题】通过列表理解取消假脱机频率表【英文标题】:Unspool frequency table by list comprehension 【发布时间】:2016-11-16 18:52:13 【问题描述】:这是一个以列表形式实现的频率表。
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
【问题讨论】:
【参考方案1】:我相信这会奏效:
unspooled = [ind for ind in range(len(table)) for val in range(table[ind])]
【讨论】:
哇,这比我所拥有的表达力要少得多。它确实有效,但坦率地说,我不知道为什么。val
何时以及如何使用?
我现在明白了。 val
不被使用。这只是在ind
上运行的循环的一次性使用。【参考方案2】:
您可以使用enumerate
从table
返回索引和项目:
>>> table = [1,3,2]
>>> [i for i, x in enumerate(table) for _ in range(x)]
[0, 1, 1, 1, 2, 2]
【讨论】:
【参考方案3】: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]
【讨论】:
以上是关于通过列表理解取消假脱机频率表的主要内容,如果未能解决你的问题,请参考以下文章