Python:迭代具有不同维度的列表,是不是有通用方法?
Posted
技术标签:
【中文标题】Python:迭代具有不同维度的列表,是不是有通用方法?【英文标题】:Python: Iterating lists with different amount of dimensions, is there a generic way?Python:迭代具有不同维度的列表,是否有通用方法? 【发布时间】:2012-05-03 13:25:11 【问题描述】:# 2x3 dimensional list
multidim_list = [
[1,2,3],
[4,5,6],
]
# 2x3x2 dimensional list
multidim_list2 = [
[
[1,2,3],
[4,5,6],
],
[
[7,8,9],
[10,11,12],
]
]
def multiply_list(list):
...
我想实现一个函数,它将列表中的所有元素乘以 2。但是我的问题是列表可以有不同数量的维度。
是否有一种通用的方法来循环/迭代多维列表,例如将每个值乘以 2?
编辑1: 感谢您的快速回答。 对于这种情况,我不想使用 numpy. 递归看起来不错,甚至不需要复制列表,实际上可能很大。
【问题讨论】:
【参考方案1】:递归是你的朋友:
from collections import MutableSequence
def multiply(list_):
for index, item in enumerate(list_):
if isinstance(item, MutableSequence):
multiply(item)
else:
list_[index] *= 2
您可以只使用isinstance(item, list)
而不是isinstance(item, MutableSequence)
,但后一种方式更具前瞻性和通用性。有关简短说明,请参阅 the glossary。
【讨论】:
这就是我想要的。很久没用递归了,差点忘了。而且我不想在这种情况下使用 numpy。 "……这也是在 python 库中进行此类检查的方式。"只是出于好奇——你想到了哪些 Python 库? @Sven Busted。搜索“电池”我发现没有这样的检查。我最接近的是shutil使用isinstance(function, collections.Callable)
。不过有大量的isinstance(x, list)
支票。我虽然认为,只要内置函数或类需要检查其 args 的类型(例如,它是列表还是字典),它都会使用 collections
中的 ABC 来执行此操作,所以用户可以用MutableSequence
子类替换list
对象并且仍然可以使用它。老实说,我认为这是他们首先引入 ABC 的一个重要原因。我将编辑我的答案。【参考方案2】:
numpy 数组开箱即用。
【讨论】:
【参考方案3】:你可以使用numpy:
import numpy as np
arr_1 = np.array(multidim_list)
arr_2 = np.array(multidim_list2)
结果:
>>> arr_1*2
array([[ 2, 4, 6],
[ 8, 10, 12]])
>>> arr_2*2
array([[[ 2, 4, 6],
[ 8, 10, 12]],
[[14, 16, 18],
[20, 22, 24]]])
【讨论】:
以上是关于Python:迭代具有不同维度的列表,是不是有通用方法?的主要内容,如果未能解决你的问题,请参考以下文章
Plotly Sunburst Chart (Python) - make_subplots 的“specs”参数必须是具有维度 (1 x 1) 的二维字典列表