Unspool frequency table by list comprehension
这里有一个频率表作为列表实现。
1 | table = [1,3,2] |
所需的输出是单个值的列表。
1 | unspooled = [0, 1, 1, 1, 2, 2] |
以下语法将完成该作业。
1 | sum((freq*[score] for score, freq in enumerate(table)), []) |
不过,作为一个测试我理解力的练习,我想知道是否有一种方法可以通过纯粹的列表理解来实现这一点。谢谢您。
(或者第二,如果有一种方法比我所拥有的那些不纯粹的列表理解更具表现力,那么我也愿意这样做。)
显然,我的语法产生了糟糕的性能。
更新。所有建议解决方案的时间安排。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 2 3 | >>> table = [1,3,2] >>> [i for i, x in enumerate(table) for _ in range(x)] [0, 1, 1, 1, 2, 2] |
我相信这是可行的:
1 | unspooled = [ind for ind in range(len(table)) for val in range(table[ind])] |
1 2 3 4 5 | 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] |