2013-11-14 29 views
1

我想在列表列表中找到一條記錄,在這種情況下是3並且獲取它們元素[2]的減法元素與元素[2]從先前的記錄在子列表中找到一個值,然後用它們的元素值減去以前的元素值

mylist = [ 
["acc", 2, 3.1,4.3,"pe"], 
["fir", 1, 3.5,5.2,"p1"], 
["sec", 3, 1.1,5.8,"pe"], 
["set", 5, 6.2,6,2,"pa"], 
["eve", 8, 5.4,5.7,"io"], 
["ewa", 3, 4.1,4.1,"po"] 
] 

結果應該是:

3.5 - 1.1和5.2 - 5.8
5.4 - 4.1和5.7 - 4.1


我可以通過這段代碼得到它,但我想學習一些更好更簡單的方法,謝謝。

i=0  
while i<len(mylist)-1: 
     if mylist[i][1] == 3: 
      print mylist[i-1][2]-mylist[i][2] 
      print mylist[i-1][3]-mylist[i][3] 
     i+=1 
+1

'[[「foo」,3,1,1,「foo」]]'打破了你的方法。 – beerbajay

回答

0

簡短的回答

for previous, current in zip(mylist[:-1], mylist[1:]): 
    if current[1] == 3: 
     print previous[2] - current[2] 
     print previous[3] - current[3] 

龍答案

我」什麼m做的是壓縮沒有第一個元素和沒有最後一個列表的列表:

>>> z = [10, 20, 30, 40, 50] 
>>> z[:-1] 
[10, 20, 30, 40] 
>>> z[1:] 
[20, 30, 40, 50] 
>>> zip(z[:-1], z[1:]) 
[(10, 20), (20, 30), (30, 40), (40, 50)] 

通過遍歷壓縮列表,我們可以依次訪問前一個和當前項目,這通過我在for循環中給出變量的名稱來清楚。

請注意,我的解決方案正確處理列表中有零個或一個項目的情況。當發生這種情況時,壓縮列表是空的,所以for循環什麼都不做。

1

而不是使用while循環,您可以使用for循環。

for row1, row2 in zip(mylist[1:], mylist[0:-1]): 
    if row1[1] == 3: 
     print [y - x for x, y in zip(row1[2:4], row2[2:4])] 

您還可以通過利用izip方法,而不是zip方法節省一些內存。

from itertools import izip 

for row1, row2 in izip(mylist[1:], mylist[0:-1]): 
    if row1[1] == 3: 
     print [y - x for x, y in izip(row1[2:4], row2[2:4])] 

這些代碼段將輸出

[2.4, -0.6] 
[1.3, 1.6] 

izip()使用generators,而不是名單。這可能會提高腳本的性能,並會節省您的內存。

如果您更喜歡上述代碼的較短版本,則可以使用列表解析。

from itertools import izip 
print [[y - x for x, y in izip(row1[2:4], row2[2:4])] for row1, row2 in izip(mylist[1:], mylist[:-1]) if row1[1] == 3] 

輸出:

[[2.4, -0.6], [1.3, 1.6]] 

你也可以將上述

for val in ([y - x for x, y in zip(row1[2:4], row2[2:4])] for row1, row2 in zip(mylist[1:], mylist[:-1]) if row1[1] == 3): 
    print val 

輸出的發電機:

[2.4, -0.6] 
[1.3, 1.6] 

請記住,通過這樣做,發電機在你訪問完第一個時候用盡e最後一項,因此如果需要存儲輸出的值,則不應使用此生成器。

0

可以爲您節省預選賽指數掉使用一臺發電機,使用發電機在後續步驟中,像這樣

gen = (x for x, y in enumerate(mylist) if y[1] == 3) 
[(mylist[x-1][2] - mylist[x][2], mylist[x-1][3] - mylist[x][3]) for x in gen] 
[(2.4, -0.5999999999999996), (1.3000000000000007, 1.6000000000000005)] 
相關問題