为迭代器的每个元素创建一个包含2个条目的列表

时间:2011-09-05 02:26:12

标签: python list iterator

我正在寻找一种更优雅的方式来做这样的事情:

[data[i/2] if i%2==0 else log10(data[i/2]) for i in xrange(len(data)*2)]

所以如果数据是[1,10,100],我想列一个清单:

[1,0,10,1,100,2]

fyi:这是输出到csv文件

4 个答案:

答案 0 :(得分:1)

>>> data = [1, 10, 100]
>>> [x for y in data for x in (y, math.log10(y))]
[1, 0.0, 10, 1.0, 100, 2.0]

答案 1 :(得分:1)

data = [1,10,100]
itertools.chain(*((x,log10(x)) for x in data))

然后制作一个清单

答案 2 :(得分:1)

sum(([x, math.log10(x)] for x in data), [])

答案 3 :(得分:0)

请原谅我回答我自己的问题,但这里的答案激发了我一点点玩,而且我得到了比上面快得多的东西:

import itertools
import numpy
data = range(1,10000)
[x for y,z in itertools.izip(data,numpy.log10(data)) for x in (y, z)]

重点是numpy.log10()比多次调用math.log10()更有效。对于10000个整数,对于Ignacio的列表理解,我得到4.59毫秒对32.8毫秒,对于JBernaro的链()来说我得到了32.9毫秒,对于卡尔的总和()得到了482毫秒。我猜sum()版本在为每个x值分配长度为2的列表时会丢失。