1

我有一个包含多个子列表的列表。

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]] 
4

3 回答 3

5

来自文档

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)]
于 2013-05-29T22:07:11.830 回答
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]]              
于 2013-05-29T22:11:01.587 回答
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

我意识到它不像其他解决方案那样优雅,但有多种选择真是太好了!

如果您在遍历列表时仍然添加到列表中,这也仍然有效!

于 2013-05-29T22:32:42.470 回答