我正在尋找一種更優雅的方式做這樣的事情:創建具有2項爲一個迭代的每個元素的列表
[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]
供參考:這是輸出到CSV文件
我正在尋找一種更優雅的方式做這樣的事情:創建具有2項爲一個迭代的每個元素的列表
[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]
供參考:這是輸出到CSV文件
data = [1,10,100]
itertools.chain(*((x,log10(x)) for x in data))
然後做一個列表
>>> 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]
對不起,我回答我的問題,但答案在這裏激發了我周圍有點玩了,我來的東西是顯著比上述速度快:
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個整數,我得到4.59毫秒,伊格納西奧的列表理解爲32.8毫秒,JBernaro鏈()爲32.9毫秒,卡爾和()爲482毫秒。我猜sum()版本會在爲每個x值分配一個長度爲2的列表時丟失。
我會說這個將是最高效的,也是非常可讀的(一旦你明白'鏈'和'*'在做什麼)。 對於那些新的蟒蛇,這需要通過像從numpy的進口*'和 '之前 '進口itertools' – drevicko
其實,這是效率最低的3發佈的 - 嵌套列表張貼伊格納西奧理解是最有效的(9.87美元與12.2美國)。不是2微秒是不必擔心的。但爲什麼有趣的解釋,請參閱此線程 - > http://stackoverflow.com/questions/952914/making-a-flat-list-out-of-list-of-lists-in-python – wim
@wim'進口這個閱讀#7 – JBernardo