gpt4 book ai didi

Python合并具有不同长度的列表列表

转载 作者:行者123 更新时间:2023-12-04 10:24:11 27 4
gpt4 key购买 nike

我想编写一个合并列表列表的函数。列表可以有不同的长度。
selected_cells = [[[1],[2],[3]], [[4],[5],[6]], [[7],[8]]]
我的预期输出是 [[1,4,7], [2,5,8], [3,6]]
我写了以下函数

def merge(lst1, lst2): 
print('Merging', lst1, 'and', lst2)
return [(sub + [lst2[i][-1]]) for i, sub in enumerate(lst1) if i < len(lst2)]

for idx, cell in enumerate(selected_cells):
if idx < (len(selected_cells)-1):
print(idx)
selected_cells[0] = merge(selected_cells[0], selected_cells[idx+1])
print('Output', selected_cells[0])

但是,这会输出 [[1, 4, 7], [2, 5, 8]]
我觉得我在这里遗漏了一些简单的东西,这让我发疯了。任何帮助,将不胜感激

最佳答案

如评论中所述,您可以使用 zip_longest来自 itertools模块。

>>> selected_cells = [[[1],[2],[3]], [[4],[5],[6]], [[7],[8]]]
>>> from itertools import zip_longest
>>> L = list(zip_longest(*selected_cells))
>>> L
[([1], [4], [7]), ([2], [5], [8]), ([3], [6], None)]

然后展平元组并删除 None值(value)观:
>>> [[x[0] for x in t if x] for t in L]
[[1, 4, 7], [2, 5, 8], [3, 6]]

另一种选择是使用折叠( functools.reduce ):
>>> selected_cells = [[[1],[2],[3]], [[4],[5],[6]], [[7],[8]]]
>>> import functools
>>> functools.reduce(lambda acc, x: [acc[i] + (x[i] if i < len(x) else []) for i in range(len(acc))], selected_cells)
[[1, 4, 7], [2, 5, 8], [3, 6]]

不过,这可能不太直观。

关于Python合并具有不同长度的列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60696922/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com