我想编写一个合并列表列表的函数。列表的长度可以变化。
`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]]
我觉得这里缺少一些简单的东西,这让我发疯。任何帮助,将不胜感激
问题来源:stackoverflow
如注释中所写,您可以在itertools模块中使用zip_longest。
>>> selected_cells = [[[1],[2],[3]], [[4],[5],[6]], [[7],[8]]]
>>> from itertools import zip_longest
>>> L = list(zip_longest(\*elected_cells))
>>> L
[([1], [4], [7]), ([2], [5], [8]), ([3], [6], None)]
然后展平元组并删除None
值:
>>> [[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]]
不过,这可能不太直观。
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。