开发者社区> 问答> 正文

Python合并长度可变的列表列表

我想编写一个合并列表列表的函数。列表的长度可以变化。

`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

展开
收起
is大龙 2020-03-23 17:18:00 429 0
1 条回答
写回答
取消 提交回答
  • 如注释中所写,您可以在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

    2020-03-23 17:18:07
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载