【问题标题】: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. 递归看起来不错,甚至不需要复制列表,实际上可能很大。

【问题讨论】:

    标签: python arrays list loops multidimensional-array


    【解决方案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]]])
      

      【讨论】:

        猜你喜欢
        • 2012-01-05
        • 2016-05-14
        • 2017-04-21
        • 1970-01-01
        • 2021-12-12
        • 2021-01-20
        • 2021-06-17
        • 2020-06-27
        • 1970-01-01
        相关资源
        最近更新 更多