通过列表理解取消假脱机频率表

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】:

您可以使用enumeratetable返回索引和项目:

>>> 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]

【讨论】:

以上是关于通过列表理解取消假脱机频率表的主要内容,如果未能解决你的问题,请参考以下文章

假脱机输出查询中涉及的多个表

PL/SQL - 在将元数据假脱机到文件后更新表

用Hash Table(哈希散列表)实现统计文本每个单词重复次数(频率)

带有链表的哈希表中的前 10 个频率

无线通信频率分配表

OS_@假脱机技术@设备分配@设备映射