2012-12-16 120 views
0

給定列表的以下列表:水平分析while循環

[[0.074,0.073,0.072,0.03,0.029,0.024,0.021,0.02],[0.02,0.02,0.015], [0.026,0.026,0.02,0.02,0.02,0.015],[0.021,0.021,0.02,0.017],[0.077,0.076,0.074,0.05,0.045,0.021],[0.053,0.05,0,0.01,0.023,0.022], [0.016,0.016]]

我該如何在列表中循環,從每個子列表中抽出#1,從每個子列表中抽出#2和從每個子列表中抽出#2和生成單獨的列表。

例如,在這種情況下#1應該包括0.074,0.02,0.026,0.021,0.077,0.063和0.016。他們將在一個單獨的單獨列表中。

我用了while循環,但對我來說,沒有工作:基於上述邏輯

a=0 
b=len(data['stock']) 

while a<=b - 1: 
    print data['stock'][a][0] 
      a = a + 1 
    print "\n" 


while a<=b - 1: 
    print data['stock'][a][1] 
     a = a + 1 
print "\n" 

while a<=b - 1: 
    print data['stock'][a][2] 
     a = a + 1 
print "\n" 

while a<=b - 1: 
    print data['stock'][a][3] 
     a = a + 1 
print "\n" 

while a<=b - 1: 
    print data['stock'][a][4] 
     a = a + 1 
print "\n" 

while a<=b - 1: 
    print data['stock'][a][5] 
     a = a + 1 
print "\n" 

while a<=b - 1: 
    print data['stock'][a][6] 
     a = a + 1 
print "\n" 

多少我解決了這個問題,並創建列表?

回答

1

一種方法是使用zip

>>> data = [[1,2,3],[4,5,6]] 
>>> zip(*data) 
[(1, 4), (2, 5), (3, 6)] 

要解決您的數據不一致的問題LY形,你可以使用izip_longest

>>> data = [[0.074, 0.073, 0.072, 0.03, 0.029, 0.024, 0.021, 0.02], [0.02, 0.02, 0.015], [0.026, 0.026, 0.02, 0.02, 0.02, 0.015], [0.021, 0.021, 0.02, 0.017], [0.077, 0.076, 0.074, 0.055, 0.045, 0.021], [0.053, 0.052, 0.051, 0.023, 0.022], [0.016, 0.016]] 
>>> from itertools import izip_longest 
>>> izip_longest(*data) 
<itertools.izip_longest object at 0x101d77c00> 
>>> list(izip_longest(*data)) 
[(0.074, 0.02, 0.026, 0.021, 0.077, 0.053, 0.016), (0.073, 0.02, 0.026, 0.021, 0.076, 0.052, 0.016), (0.072, 0.015, 0.02, 0.02, 0.074, 0.051, None), (0.03, None, 0.02, 0.017, 0.055, 0.023, None), (0.029, None, 0.02, None, 0.045, 0.022, None), (0.024, None, 0.015, None, 0.021, None, None), (0.021, None, None, None, None, None, None), (0.02, None, None, None, None, None, None)] 

,因此:

>>> columns = list(izip_longest(*data)) 
>>> columns[0] 
(0.074, 0.02, 0.026, 0.021, 0.077, 0.053, 0.016) 
>>> columns[1] 
(0.073, 0.02, 0.026, 0.021, 0.076, 0.052, 0.016) 
>>> columns[2] 
(0.072, 0.015, 0.02, 0.02, 0.074, 0.051, None) 

我不知道你想爲「#3」做什麼 - 你的最後一個子表只有兩個元素。 izip_longest有一個fillvalue選項,您可以使用該選項指定要執行的操作,其默認值爲None(這就是爲什麼columns[2]中的最後一個條目爲None)的原因。

+0

這很酷。如何處理列表中存在重複值的情況。例如,如果您查看列表#7,其中元素爲0.016和0.016。他們都將排名第一,但代碼會將它們視爲單獨的項目。在做水平列表建設之前,有沒有辦法擺脫每個子列表中的重複價格? –

2

你可以使用itemgetter

>>> from operator import itemgetter 
>>> map(itemgetter(0), data) 
[0.074, 0.02, 0.026, 0.021, 0.077, 0.053, 0.016] 
>>> map(itemgetter(1), data) 
[0.073, 0.02, 0.026, 0.021, 0.076, 0.052, 0.016] 

你也可以使用列表理解(這可能是更具可讀性):以調換名單

>>> [l[0] for l in data] 
[0.074, 0.02, 0.026, 0.021, 0.077, 0.053, 0.016]