2013-05-29 48 views
1

我有一個包含多個子列表的列表。Python:我如何迭代每個子列表的第一個元素而不知道子列表的數量?

l = [[a,b,c],[3,5,0],[3,1,0],...] # I do not know how many sublists there are beforehand. 

我該如何迭代每個子列表的第一項?

e.g. a,3,3 then b,5,1 ... 

我想這樣做:

for x,y,z... in zip(l[1],l[2],l[3]...) # "..." representing other sublists 
    do something with x,y,z... if condition... 

當然這是行不通的,因爲我不知道子列表事先存在多少。

最後,我要篩選的現有的子列表,如果同一索引處,所有數值都等於零。例如:c,0,0將被刪除(因爲所有數字均爲零)。但是,a,3,3和b,5,1仍然存在。最後,我需要3個新的過濾子列表包含:

lnew = [[a,b],[3,5],[3,1]] 

回答

5

docs

zip()*運營商一起可以用來解壓縮列表

>>> lis = [['a','b','c'],[3,5,0],[3,1,0]] 
>>> for x,y,z in zip(*lis): 
    print x,y,z 
...  
a 3 3 
b 5 1 
c 0 0 

我要篩選現有的子表,如果在同一個指數,所有 個數值等於零

>>> zipp = [x for x in zip(*lis) if any(y != 0 for y in x \ 
              if isinstance (y,(int,float))) ] 
>>> zip(*zipp) 
[('a', 'b'), (3, 5), (3, 1)] 
+1

你需要使用一個元組,而不是'X,Y,z'因爲OP不知道有多少元素是'lis'。 –

+0

我認爲Ashwini在x被改爲x,y,z之前就已經有了。 – imagineerThat

+0

任何想法如何做我的問題的第二部分?從「最終」開始...... – imagineerThat

2

喜歡的東西:

from numbers import Number 
lis = [['a','b','c'],[3,5,0],[3,1,0]] 
print [list(el) for el in zip(*[el for el in zip(*lis) 
     if any(i for i in el if isinstance(i, Number))])] 
# [['a', 'b'], [3, 5], [3, 1]]    
2

嗯,這裏的答案似乎是不錯的,但我會提供一種替代方案:

l = [['a', 'b', 'c'], [3, 5, 0], [3, 1, 0]] 
i = 0 
while True: 
    try: 
     do_whatever(l[i][0]) 
     i += 1 

    except IndexError: 
     break 

我意識到它並不像其他解決方案那樣優雅,但是它有很多可供選擇的優點!

,這也仍然有效,如果你還在添加到列表中,你通過它迭代!

相關問題