如何将固定长度的多个列表合并在一起,以获得在特定位置具有最新值的单个列表。在下面的示例中,结果为[1,33,222,3333,11111]
。
l1 = [1, "", 111, "", 11111]
l2 = ["", 22, 222, 2222, ""]
l3 = ["", 33, "", 3333, ""]
l4 = ....
l5 = ...
....
是否有任何内置功能来执行此操作。我可以使用两个循环来完成它,但必须有一些其他聪明的方法来做同样的
答案 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的回答。