1

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

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

是否有任何内置功能可以做到这一点。我可以使用两个循环来做到这一点,但必须有其他一些聪明的方法来做同样的事情

4

2 回答 2

5

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

[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])]
于 2013-08-12T22:04:11.947 回答
0

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

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

ifli是@Rohit Jain 的答案中的列表列表。

于 2013-08-12T23:00:04.957 回答