在Python(2.7)中展平任何列表的递归函数不起作用

时间:2015-02-03 07:39:39

标签: python function debugging recursion

我希望能够展平任何嵌套的一维列表。我想要打印结果。 我有三个样本列表可供开始使用。我尝试运行文件时遇到错误。

以下是代码:

import collections, itertools

listoflists = [[3, 12], [223, [[44], 1]], 6]
listoflists2 = [[9, 38], [7, [[36], 5]], 4]
listoflists3 = [[1, 72], [3, [[4], 35]], 6, [7]]

print 'Option 1 is:'
print listoflists
print 'Option 2 is:'
print listoflists2
print 'Option 3 is:'
print listoflists3

userInput = raw_input("Which Option do you want?")
userInput = int(userInput)

listsvent = []

if(userInput == 1): userOption = listoflists
elif(userInput == 2): userOption = listoflists2
elif(userInput == 3): userOption = listoflists3; print "We're using Option 3";

class powerQ1:
        def flatten(self, uo):
            for bb in uo:
                if isinstance(bb, collections.Iterable) and not isinstance(bb, basestring):
                        for sub in flatten(bb):
                                print sub
                else:
                        print bb

s = powerQ1()
s.flatten(userOption)

这是错误:

 python p1cp.py
Option 1 is:
[[3, 12], [223, [[44], 1]], 6]
Option 2 is:
[[9, 38], [7, [[36], 5]], 4]
Option 3 is:
[[1, 72], [3, [[4], 35]], 6, [7]]
Which Option do you want?1
Traceback (most recent call last):
  File "p1cp.py", line 34, in <module>
    s.flatten(userOption)
  File "p1cp.py", line 28, in flatten
    for sub in flatten(bb):
NameError: global name 'flatten' is not defined

有什么问题?递归很困难。

2 个答案:

答案 0 :(得分:0)

问题在于:

for sub in flatten(bb):

您在此处调用未定义的全局函数flatten(Exception消息称为!)。致电flatten方法:

for sub in self.flatten(bb):

答案 1 :(得分:0)

你在flatten的定义中递归使用flatten,但是在方法的上下文中你使用它就好像它是一个函数,而不是一个方法,实际上它是powerQ1类型的一个方法对象

换句话说,看一下递归调用。这应该像self.flatten([其他东西在这里])而不是只是对flatten()的裸调用,因为全局函数flatten不存在。请记住,明确比隐含更好。因此,在Python中,您必须在使用方法时指定对象调用,即使在类范围内也是如此。这与Java不同,当您在非静态类上下文中隐含调用对象时,您不必指定它。

TL; DR:flatten是绑定方法,不是函数。你必须考虑到你的递归调用。请记住,显式总是优于隐式。