【问题标题】:Convert a list of lists to 3D list using list comprehension使用列表推导将列表列表转换为 3D 列表
【发布时间】:2020-10-08 19:48:50
【问题描述】:

所以我得到了一个列表列表(我不想说 2D 列表,因为它有不同的大小)

mylist = [[0, 4, 3, 2, 1], [0, 3, 4, 1], [0, 4, 1], [0, 2, 1], [0, 3, 4, 1], [0,1]] #len(mylist) = 6

我想每隔三个元素将这个列表列表转换为“3D列表”,这样我就可以得到

newlist = [[[0, 4, 3, 2, 1], [0, 3, 4, 1], [0, 4, 1]], [[0, 2, 1], [0, 3, 4, 1], [0, 1]]]

也许这是一个非常基本的问题,我想我可以使用 Numpy 做到这一点,但我正在尝试学习列表理解,到目前为止我看到的每个示例在每个列表中都有相同数量的元素,提前谢谢你,对不起,如果这是一个简单的问题。

【问题讨论】:

  • 不一定,mylist 可以有我不知道,9 个元素我可以除以 3 或 15 个元素,我可以除以 3 或 5

标签: python list list-comprehension


【解决方案1】:

到目前为止,我看到的每个示例在每个列表中都有相同数量的元素,

这是因为许多示例都从源列表中获取元素,对其进行转换(映射),然后构造一个新的转换列表。如果不满足有关正在处理的项目的特定条件,您还可以在列表理解中有一个条件,它将从目标列表中删除元素。 You may want to see my other answer about list comprehension


有一点需要注意:通过简单列表理解,列表的“维度”或形状不会改变。至少,您可能需要嵌套它。 [[y for y in x] x for x in z] 之类的东西,但是如果你坚持使用它,你将不得不探索使用:

  • 分块(这是非常标准的;只需在此处搜索“分块 python 列表”)
  • 或者,一个更邪恶的选择:Zip 3 一起引用同一个迭代器。 ;)

回答您的问题:我认为不需要列表理解。只是普通的旧幻灯片和列表附加:

newlist = [mylist[:3]] + [mylist[3:]]
print(newlist)
# [[[0, 4, 3, 2, 1], [0, 3, 4, 1], [0, 4, 1]], [[0, 2, 1], [0, 3, 4, 1], [0, 1]]]

.. 请注意,以上内容无论如何都不是通用解决方案。您很可能需要上述两点之一。


这里有一个更通用的解决方案。如果您正在学习 List Comprehension,可能需要一段时间才能完全理解其工作原理:)

>>> items = list(range(20))
>>> it = iter(items)
>>> items_in_one_chunk = 4
>>> iters = [it] * items_in_one_chunk
>>> [list(x) for x in zip(*iters)]
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19]]

【讨论】:

  • 谢谢!是的,这是一个例子,我一直在寻找更通用的解决方案,但我无法正常工作
  • 谢谢!,我可以使用这个 newlist = [mylist[i:i+n] for i in range(0, len(mylist), n)] 其中 n 是我想做的片数
  • 现在,您已经找到了一种方法,我将用我所说的邪恶来更新答案。 :)
【解决方案2】:

您可以使用 slice() 函数将列表每 3 个元素拆分一次。查看here 了解其逻辑。 this 的讨论也与您想要实现的目标相似。

【讨论】:

    猜你喜欢
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    相关资源
    最近更新 更多