Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何展平python列表?输入是列表、字符串或整数_Python - Fatal编程技术网

如何展平python列表?输入是列表、字符串或整数

如何展平python列表?输入是列表、字符串或整数,python,Python,下面是我用来压平python列表的代码。我试着用递归的概念来做同样的事情。输入可以是整数、字符串或列表。我所挣扎的是我无法理解为什么我的回报会给我一个重复价值的列表?我如何纠正相同的错误 copyList = [] def flatten(aList): for char in aList: if isinstance(char,int) or isinstance(char,str): copyList.append(char)

下面是我用来压平python列表的代码。我试着用递归的概念来做同样的事情。输入可以是整数、字符串或列表。我所挣扎的是我无法理解为什么我的回报会给我一个重复价值的列表?我如何纠正相同的错误

copyList = []
def flatten(aList):
    for char in aList:
        if isinstance(char,int) or isinstance(char,str):
            copyList.append(char)
        else:
            char_pos = aList.index(char) + 1
            return  flatten(char) + flatten(aList[char_pos:len(aList)]) 
    print copyList
    return copyList
就获得正确的输出而言,我的输出是正确的,但返回的结果似乎让我看到了重复多次的列表。无法理解出了什么问题

此处的示例输出:展平([1,'a',2,['alpha']],3,4])

[1,'a',2,'alpha'][1,'a',2,'alpha'][1,'a',2,'alpha',3,4]

输出[2]:[1,'a',2,'alpha',1,'a',2,'alpha',1,'a',2,'alpha', [3,4]


您错误地实现了递归。必须在函数中初始化
copyList
,然后在
else
子句中附加到它:

def flatten(aList):
    copyList = []
    for char in aList:
        if isinstance(char,int) or isinstance(char,str):
            copyList.append(char)
        else:
            char_pos = aList.index(char) + 1
            return copyList + flatten(char) + flatten(aList[char_pos:len(aList)]) 
    return copyList

在不手动处理列表的情况下:

def iflatten(seq):
    for item in seq:
        if isinstance(item, list):
            for subitem in iflatten(item):
                yield subitem
        else:
            yield item

def flatten(seq):
    return list(iflatten(seq))
与编写时页面上的其他解决方案一样,它只处理非循环列表


编辑:
print
语句告诉我OP使用的是Python 2,所以我用嵌套的for循环替换了
yield from
表达式。

非常感谢您的编辑。代码现在可以正常工作了。不过有一个问题,我在程序中加入了print语句,但我无法理解为什么在函数外部初始化copyList时,m递归实现不正确,并且没有在返回中添加copyList。你能直观地解释一下吗?@PradyutVatsa基本上是在函数外部初始化返回值,使其成为一个全局变量。然后,在每次递归中,你不断地将已经处理过的元素添加到它上面。@Selchuk,虽然直觉上我知道这一点,但我无法理解。我试着分解我的原始代码来理解这一点。第一步:当我调用flatte([1,'a',2,[['alpha']],3,4]时,if语句一直执行到遇到2,copyrist被初始化为[1,'a',2]。然后当它遇到['alpha']]时,它转到else循环,并返回flatte(['alpha']]+flatte([3,4])。flatte(['alpha']])求值为返回flatte(['alpha']+flatte])它将“alpha”附加到copyrist,而flatte([])没有任何作用。现在我的copyrist是[1,'a',2,'alpha'],我们计算flatte([3,4],它返回的值是[1,'a',2,'alpha',3,4]。现在回到第一个返回调用的环境,我得到的返回结果是[1,'a',2,'alpha']+[1,'a',2,'alpha',3,4]这应该给我一个[1,'a',2,'alpha',1,'a',2,'alpha',3,4]的输出,而不是生成的输出。因此,在实践中,我仍然不清楚出了什么问题。以上是基于我对代码的错误版本
def iflatten(seq):
    for item in seq:
        if isinstance(item, list):
            for subitem in iflatten(item):
                yield subitem
        else:
            yield item

def flatten(seq):
    return list(iflatten(seq))