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
,如果对象是给定类/类型的子类的实例,这通常是所需的行为。此外,由于您可以使用类/类型的元组而不是单个元组,因此它似乎更强大。您是否收到特定错误你不是说“不起作用”吗?你的缩进没有张贴的意义。请仔细检查函数体是否实际缩进。我第一眼看到你的迭代解决方案是