合并固定长度的多个列表

时间:2013-08-12 21:59:26

标签: python

如何将固定长度的多个列表合并在一起,以获得在特定位置具有最新值的单个列表。在下面的示例中,结果为[1,33,222,3333,11111]

l1 = [1,    "", 111,    "", 11111]
l2 = ["",   22, 222,    2222,   ""]
l3 = ["",   33, "", 3333,   ""]
l4 = ....
l5 = ...
....

是否有任何内置功能来执行此操作。我可以使用两个循环来完成它,但必须有一些其他聪明的方法来做同样的

2 个答案:

答案 0 :(得分:5)

您可以在元组上使用zip(l1, l2, l3)然后使用or运算符:

[tup[2] or tup[1] or tup[0] for tup in zip(l1, l2, l3)]

or运算符返回第一个真值。因为你想要最后一个真值,所以你需要在元组元素上反向应用or运算符。

或者您可以反向zip列表,并按顺序使用or运算符:

[tup[0] or tup[1] or tup[2] for tup in zip(l3, l2, l1)]

<强>更新

我建议您改为list of list而不是列表的可变数量。在这种情况下,您可以得到如下结果:

li = [[1,    "", 111,    "", 11111], 
      ["",   22, 222,    2222,   ""], 
      ["",   33, "", 3333,   ""], ..... so on
     ]

print [reduce(lambda a, b: a or b, tup) for tup in zip(*li[::-1])]

答案 1 :(得分:0)

另一种方法是使用map和函数来获取一系列参数中的第一个非空白项:

def first_nonblank(*args):
    for item in args:
        if item is not '':
            return item

print map(first_nonblank, l3, l2, l1)

print map(first_nonblank, *li[::-1])

如果li是列表列表,请参阅@Rohit Jain的回答。