2011-09-05 84 views

回答

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

然後做一個列表

+0

我會說這個將是最高效的,也是非常可讀的(一旦你明白'鏈'和'*'在做什麼)。 對於那些新的蟒蛇,這需要通過像從numpy的進口*'和 '之前 '進口itertools' – drevicko

+0

其實,這是效率最低的3發佈的 - 嵌套列表張貼伊格納西奧理解是最有效的(9.87美元與12.2美國)。不是2微秒是不必擔心的。但爲什麼有趣的解釋,請參閱此線程 - > http://stackoverflow.com/questions/952914/making-a-flat-list-out-of-list-of-lists-in-python – wim

+0

@wim'進口這個閱讀#7 – JBernardo

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

這是我在腦海中閱讀和思考的那種表達方式「,Python的設計是可讀的?Riiiight。」不要說它不工作或不聰明......(或者我不喜歡Python,因爲我這樣做。)只有在我的腦海中解析這種列表理解纔會導致頭痛。 – cdhowie

+0

嵌套'for'循環的問題是,你必須在腦海中執行代碼以知道發生了什麼......而這個只是爲了將數據平坦化 – JBernardo

+0

這是第一次看到它時的wtf時刻,但很容易(y,log(y)):yield x' – wim

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

我可以看到你在這裏做什麼,但這給了我'TypeError:不支持的操作數類型(s)爲+:'int'和'list'',我一直沒能找出爲什麼.. – drevicko

+0

它適合我。你是否錯過了'''''參數'sum'? –

+0

哎呀!看起來像numpy.sum()干擾 - 我的壞習慣做'從numpy進口*'!有趣的是,如果你沒有指定'[]'作爲初始值,'sum()'(本地的,而不是numpy的sum())開始與一個初始的(數字)'0'相加並且引發上面的TypeError。 – drevicko

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的列表時丟失。

相關問題