【问题标题】:How to concatenate a list of sublists equally chunked如何连接同样分块的子列表列表
【发布时间】:2021-12-09 19:18:53
【问题描述】:

我有一个列表,其中包含两种不同类型项目的子列表(例如,catsdogs)。我还有一个函数 chunk(list, n_sublists)list 拆分为大小相等的 n_sublists

然后,我想创建一个最终列表,将每种类型的分块列表合并。一个例子:

cats_and_dogs = [ [dog1, dog2, dog3, dog4], [cat1, cat2] ]

splitted_chunks = [[[dog1, dog2], 
                    [dog3, dog4]],
                  [[cat1], 
                  [cat2]]] 

final_merged_sublists = [ [dog1, dog2, cat1], [dog3, dog4, cat2] ]

我希望这个例子能说明问题。但是,如果需要,我可以提供更多解释。

提前致谢。

【问题讨论】:

  • splitted_chunkschunk(cats_and_dogs, n_sublists=2) 的输出吗?
  • 不,我必须先调用 chunk(dogs, 2) 再调用 chuk(cats) 并追加两者

标签: python python-3.x list nested-lists


【解决方案1】:

你可以在 zip 上做一个循环:

list(x+y for x,y in zip(chunk(dogs,2), chunk(cats,2))

输出:

[['dog1', 'dog2', 'cat1'], ['dog3', 'dog4', 'cat2']]

更新:一般情况下,使用reduce

from functools import reduce

splitted_chunks = map(lambda x: chunk(x,2), cats_and_dogs)
list(reduce(lambda x,y: x+y, z) for z in zip(*splitted_chunks) )

【讨论】:

  • 很好的解决方案。但是是否可以将其扩展到更通用的情况(即狗、猫、斑马、乌龟等的列表......)
  • @heresthebuzz 查看更新后的答案。
  • map 不需要list,把它当作生成器,效率会更高。
  • @mozway 啊,是的。我不知道我们可以拆开生成器的包装。
  • 很好的答案。非常感谢您,先生!
【解决方案2】:

您可以使用zipitertools.chain

splitted_chunks = [[['dog1', 'dog2'], 
                    ['dog3', 'dog4']],
                  [['cat1'], 
                   ['cat2']]] 

from itertools import chain
final_merged_sublists = [list(chain.from_iterable(x)) for x in zip(*splitted_chunks)]

输出:

[['dog1', 'dog2', 'cat1'], ['dog3', 'dog4', 'cat2']]

注意。要将chunk 应用于任意大小的原始列表的所有子列表,请使用map

【讨论】:

    猜你喜欢
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 2023-03-22
    • 1970-01-01
    • 2015-09-08
    相关资源
    最近更新 更多