Python 取消装箱多层值的正确方法

Python 取消装箱多层值的正确方法,python,Python,我有一个多层类型/列表容器。使用插入的列表理解手动取消绑定最终数据让我非常头痛 [[(23,)],[(124,)],[(45,)]] 在这样的简单列表中取消装箱最终值的正确方法是什么 [23,124,45] 我已经试过谷歌了,但我看到的唯一解释是什么是boxi/取消装箱,但我确信应该有一些简单的方法来做到这一点,除了插入列表的理解 In [1]: v = [[(23,)],[(124,)],[(45,)]] In [2]: [b[0] for b in [a[0] for a in v]]

我有一个多层类型/列表容器。使用插入的列表理解手动取消绑定最终数据让我非常头痛

[[(23,)],[(124,)],[(45,)]]
在这样的简单列表中取消装箱最终值的正确方法是什么

[23,124,45]
我已经试过谷歌了,但我看到的唯一解释是什么是boxi/取消装箱,但我确信应该有一些简单的方法来做到这一点,除了插入列表的理解

In [1]: v = [[(23,)],[(124,)],[(45,)]]

In [2]: [b[0] for b in [a[0] for a in v]]
Out[3]: [23, 124, 45]
另一种类似的方法类似于下面的代码

#--------------------------------------------------------------------
class   Expander:
    def __init__( self ):
        self.resultList = []

    def Expand( self, srcList ):
        self.resultList = []
        self.Internal_Expand( srcList )
        return self.resultList

    def Internal_Expand( self, srcList ):
        if hasattr(srcList, '__iter__'):
            for i in srcList:
                self.Internal_Expand( i )
        else:
            self.resultList.append( srcList )
#--------------------------------------------------------------------
if __name__ == '__main__':
    srcList = [[(23,)],[(124,)],[(45,)]]
    print Expander().Expand( srcList )
#--------------------------------------------------------------------
好的,我终于找到了这条路

#--------------------------------------------------------------------
def Expand( srcList ):
    resultList = []
    def Internal_Expand( xList ):
        if hasattr(xList, '__iter__'):
            for i in xList:
                Internal_Expand( i )
        else:
            resultList.append( xList )
    Internal_Expand( srcList )
    return resultList
#--------------------------------------------------------------------
if __name__ == '__main__':
    srcList = [[(23,)],[(124,)],[(45,)]]
    print Expand( srcList )
#--------------------------------------------------------------------

假设您的所有数据都不是可编辑的,我们可以使用递归方法:

import collections

def iterable(obj):
    return isinstance(obj, collections.Iterable)

def unbox(obj):
    if iterable(obj):
        result = []
        for x in obj:
            result.extend(unbox(x))
        return result
    else:
        return [obj]
如果需要,此方法可以转换为顺序函数:

from collections import deque

def unbox(obj):
    obj_list = deque([obj])
    result = []
    while(len(obj_list) > 0):
        current = obj_list.popleft()
        if iterable(current):
            obj_list.extend(current)
        else:
            result.append(current)
    return result

数据总是嵌套3层,还是要用未知数量的嵌套层取消装箱?未知数量的嵌套层也让我感兴趣。多亏了tobias_k,我错过了“展平”这个词。将检查您是否已发布。它100%回答了我的问题。谢谢,我想还有另一种方法可以做到这一点。另一种方法?像什么?
from collections import deque

def unbox(obj):
    obj_list = deque([obj])
    result = []
    while(len(obj_list) > 0):
        current = obj_list.popleft()
        if iterable(current):
            obj_list.extend(current)
        else:
            result.append(current)
    return result