【问题标题】:Recursive and factory problems递归和工厂问题
【发布时间】:2013-11-26 20:07:19
【问题描述】:

如何更改我的代码以在更改后返回 LLL?

我有一个清单:

LLL = [12,[3,[5],[6,[[7, [],8], []]]], [8, [0,87,23,434,444,33]]]

我称这个函数为:

def testQ1():
dolist_deep_add1 = factory_dolist_deep_A( (lambda x: x + 1) )
print ('dolist_deep_add1(LLL) : ', dolist_deep_add1(LLL))

此函数应在更改后返回列表。 我期待的结果:

LLL = [13,[4,[6],[7,[[8, [],9], []]]], [9, [1,88,24,435,445,34]]] 

factory_dolist_deep_A 代码:

def factory_dolist_wide_A( fa ):
 def print_wide (L):

    def pw1(x):
        if type(x) is int:
         x = fa(x)
        print(str(x)+' ', end='')

    def pwstart (L, lvl):
        print('\nlevel ' + str(lvl) + " : " , end='')
        pw      (L, lvl)

    def pw (L, lvl):
        if not L: return
        Q = []
        for a in L:
            if type(a) is list:
                if a == [] : pw1('[]')
                else: Q.extend(a)
            else:
                pw1(a)
        pwstart( Q , lvl + 1)

    return pwstart(L, 0)
return print_wide

现在它只是获取数字并打印它们,而不更改列表本身。

我想更改factory_dolist_wide_A( fa ): 以便它返回一个更改后的列表。

它的工作方式应该与此打印功能相同,不仅打印更改,还可以在列表本身中进行更改。

【问题讨论】:

  • 你的问题很不清楚。 “更改后返回 L”是什么意思?
  • 我的意思是这里只是打印,我想返回更改列表,而不仅仅是打印更改...
  • 很清楚他想要什么。这些函数当前打印使用传入的函数更改的列表。他希望这些函数也返回更改的列表。
  • 我该怎么做,有什么想法吗?...请帮助..尝试过任何事情

标签: python list recursion


【解决方案1】:

您的代码有很多不必要的函数定义。 print_wide(L) 被定义为pwstart(L, 0),pwstart(L, lvl) 被定义为pw(L,lvl)。

我将所有这些定义折叠成print_wide。我还将pw1() 更改为modify()。

此外,您现有的代码存在严重错误。由于Q.extend(a) 完全没有任何意义,因此我将其删除。

因此,以下代码遍历整个数组,并生成您要求的结果,但它不会打印您的原始代码将打印的内容。

def factory_dolist_wide_A( fa ):
    def print_wide (L, lvl=0):
        def modify(x):
            if type(x) is int:
                x = fa(x)
                print(str(x) + ' ', end='')
            else:
                print('[] ', end='')
            return x

        print('\nlevel ' + str(lvl) + " : " , end='')

        newList = []
        for a in L:
            if type(a) is list:
                newList.append(print_wide(a, lvl+1))
            else:
                newList.append(modify(a))
        return newList
    return print_wide

LLL = [12,[3,[5],[6,[[7, [],8], []]]], [8, [0,87,23,434,444,33]]]

def testQ1():
    dolist_deep_add1 = factory_dolist_wide_A( (lambda x: x + 1) )
    x = dolist_deep_add1(LLL)
    print()
    print('dolist_deep_add1(LLL) : ', x)

testQ1()

【讨论】:

  • 感谢您的有趣回答!对我帮助很大,但我仍然被要求不要创建新列表而是更改给出的列表。
  • 你将如何使用像 a = [1,2,3] 这样的简单数组来实现它?
  • 如果你无法理解如何原地更改a = [1,2,3] 之类的列表,那么你首先需要学习 Python 的基础知识。您可以阅读基本的 Python3 教程,并尝试示例,直到您理解它们为止。您还可以搜索更改 Python 列表的人的示例。
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 2016-02-01
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
相关资源
最近更新 更多