Python:flatte函数在控制台中工作,但在文件中不工作?

Python:flatte函数在控制台中工作,但在文件中不工作?,python,flatten,Python,Flatten,我正在做一个将嵌套列表展平的练习。代码在控制台中工作,但在文件中运行时不工作。我不知道发生了什么事( 我首先尝试递归地解决这个问题,但决定先尝试迭代 编辑:在文件中执行时,它只打印出原始函数参数 TIA问题在于,展平函数只展平一个级别。doctest打印错误的原因是因为它确实出错。它们不是您传入的 File "test.py", line 5, in __main__.flatten Failed example: flatten([[9, [7, 1, 13, 2], 8], [7,

我正在做一个将嵌套列表展平的练习。代码在控制台中工作,但在文件中运行时不工作。我不知道发生了什么事(

我首先尝试递归地解决这个问题,但决定先尝试迭代

编辑:在文件中执行时,它只打印出原始函数参数
TIA

问题在于,展平函数只展平一个级别。doctest打印错误的原因是因为它确实出错。它们不是您传入的

File "test.py", line 5, in __main__.flatten
Failed example:
    flatten([[9, [7, 1, 13, 2], 8], [7, 6]])
Expected:
    [9, 7, 1, 13, 2, 8, 7, 6]
Got:
    [9, [7, 1, 13, 2], 8, 7, 6]

您应该研究一种递归方法,它不是附加
y
——而是在
y
上调用flatte。
if type(x)!=type([])
可以是您的基本情况。

问题是您的展平函数只展平一个级别。doctest打印错误的原因是它确实出错。它们不是您传入的

File "test.py", line 5, in __main__.flatten
Failed example:
    flatten([[9, [7, 1, 13, 2], 8], [7, 6]])
Expected:
    [9, 7, 1, 13, 2, 8, 7, 6]
Got:
    [9, [7, 1, 13, 2], 8, 7, 6]

您应该研究一种递归方法,它不是附加
y
——而是在
y
上调用flatte。
如果type(x)!=type([])
可以作为基本情况。

您的应用程序没有做任何事情

Input:  [3,[5, [5, [1, 5], 5], 5], [5, 6]]
Output: [3, 5, [5, [1, 5], 5], 5 ,  5, 6]

您需要保持展平直到它完成,例如使用递归。简单但只需对数据进行一次额外的传递:如果
type(x)==type([])
,则返回
flatte(Simple)
,而不是在函数末尾返回
Simple

您的应用程序没有执行任何操作

Input:  [3,[5, [5, [1, 5], 5], 5], [5, 6]]
Output: [3, 5, [5, [1, 5], 5], 5 ,  5, 6]

您需要保持展平直到它完成,例如使用递归。简单但只需对数据进行一次额外传递:如果
type(x)==type([])
,则返回
flatte(Simple)
,而不是在函数末尾返回
Simple

我认为@orangeoctopus的答案是正确的,但没有捕捉到“为什么它在控制台中工作”的问题。我想猜测一下:

它在控制台中不起作用。我认为您测试了一部分碰巧起作用的输入。例如

>>> flatten([2, 9, [2, 1, 13, 2], 8, [2, 6]])
[2, 9, 2, 1, 13, 2, 8, 2, 6]
工作

但是


没有那么多。

我认为@orangeoctopus的答案是正确的,但没有抓住“为什么它在控制台中工作”的问题。我想猜测一下:

它在控制台中不起作用。我认为您测试了一部分碰巧起作用的输入。例如

>>> flatten([2, 9, [2, 1, 13, 2], 8, [2, 6]])
[2, 9, 2, 1, 13, 2, 8, 2, 6]
工作

但是

没有那么多。

如果你想“欺骗”,你可以这样做:

L = [1, 2, [3, 4], 5, 6, [7, 8, [9, 10, 11]]]
s = repr(L)
s = '[' + s.replace('[','').replace(']','') + ']'
L = eval(s)
我有点好奇,与“正常”的扁平化操作相比,它的速度有多快


编辑: 粗略的测试表明,不管数据复杂度如何,欺骗方法所需的时间几乎是恒定的,而递归解决方案的时间会增加

较大的

作弊:7.13282388182
递归:2.84676811407

小的

作弊:7.08800692623
递归:0.486098086038

以下是我的代码(我对更大的数据集非常好奇!):

如果你想“作弊”,你可以这样做:

L = [1, 2, [3, 4], 5, 6, [7, 8, [9, 10, 11]]]
s = repr(L)
s = '[' + s.replace('[','').replace(']','') + ']'
L = eval(s)
我有点好奇,与“正常”的扁平化操作相比,它的速度有多快


编辑: 粗略的测试表明,不管数据复杂度如何,欺骗方法所需的时间几乎是恒定的,而递归解决方案的时间会增加

较大的

作弊:7.13282388182
递归:2.84676811407

小的

作弊:7.08800692623
递归:0.486098086038

以下是我的代码(我对更大的数据集非常好奇!):


我的答案与@DonaldMiner的答案非常相似(事实上我一开始也是这样),但后来注意到,如果列表中的字符串包含
“[”
“]”
,则它将失败

例如,在这里不起作用:

["Hello", "World", "A", "[Menu]"]
我编写了一个类似的函数(稍微复杂一点,只删除列表中不在字符串中的
[
]

from ast import literal_eval
def flatten(to_squash):
    """This will flatten a list, no matter the recursion limit."""
    instring = False
    squashed = []
    index = 0
    print(repr(to_squash))
    for char in repr(to_squash):
        if char == '"' or char == "'":
            instring = not instring
            print(instring, char)
            squashed.append(char)
        elif not instring and char == "[" or not instring and char == "]":
            pass
        else:
            squashed.append(char)
        index += 1

    print("".join([item.strip() for item in squashed]))
    return literal_eval("".join(squashed))

当然,您也可以使用
eval()
,但前提是您不从somwhere读取列表(它是由程序生成的)。否则,有人只需输入一个命令,python就会执行它。

我的答案与@DonaldMiner的答案非常相似(事实上,我也是从这个开始的),但随后注意到,如果列表中的字符串包含
“[”
“]”
,则它将失败

例如,在这里不起作用:

["Hello", "World", "A", "[Menu]"]
我编写了一个类似的函数(稍微复杂一点,只删除列表中不在字符串中的
[
]

from ast import literal_eval
def flatten(to_squash):
    """This will flatten a list, no matter the recursion limit."""
    instring = False
    squashed = []
    index = 0
    print(repr(to_squash))
    for char in repr(to_squash):
        if char == '"' or char == "'":
            instring = not instring
            print(instring, char)
            squashed.append(char)
        elif not instring and char == "[" or not instring and char == "]":
            pass
        else:
            squashed.append(char)
        index += 1

    print("".join([item.strip() for item in squashed]))
    return literal_eval("".join(squashed))

当然,您也可以使用
eval()
,但前提是您不从somwhere读取列表(它是由程序生成的)。否则,有人只需输入一个命令,python就会执行它。

您是否收到一个特定的错误,您所说的“不工作”是什么意思“?您的缩进没有张贴的意义。请仔细检查函数体是否实际缩进。我第一眼看到的是您的迭代解决方案已被破坏。我建议您测试使用此
][[][[][[][[][[1][][[1][[2][[1][[1][3][2][/code>(输出:
[1,2]
)@centr0,你的代码混合了制表符和空格(在编写Python时这是个坏主意,在编写这么多问题时显然不好)——我用8个空格替换了制表符。这就是你的代码的样子吗?@Nick T:稍微少一点吹毛求疵:我记得,首选方法是使用
isinstance(obj,class\u或\u type)
而不是
类型(x)==typename
,因为
isinstance
也将返回
True
,如果对象是给定类/类型的子类的实例,这通常是所需的行为。此外,由于您可以使用类/类型的元组而不是单个元组,因此它似乎更强大。您是否收到特定错误你不是说“不起作用”吗?你的缩进没有张贴的意义。请仔细检查函数体是否实际缩进。我第一眼看到你的迭代解决方案是