Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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_String_List_Recursion_Printing - Fatal编程技术网

Python 如何使用递归打印列表列表中的数据

Python 如何使用递归打印列表列表中的数据,python,string,list,recursion,printing,Python,String,List,Recursion,Printing,蟒蛇。它是一个列表列表。如何使列表中的数据表示为'moreline'string'的函数,使每一个数据都显示在它的新行中,并且在它前面有如此多的'*'和数据的深度一样多 示例:我们有list[2,4,3,8,1],现在函数必须生成并返回字符串,哪个函数“print”像这样打印出来: * 2 * 4 *** 3 *** 8 ** 1 我现在只做了这个,它不起作用 def Function(List): s='' Count=0 for element in List:

蟒蛇。它是一个列表列表。如何使列表中的数据表示为'moreline'string'的函数,使每一个数据都显示在它的新行中,并且在它前面有如此多的'*'和数据的深度一样多

示例:我们有list
[2,4,3,8,1]
,现在函数必须生成并返回字符串,哪个函数“print”像这样打印出来:

* 2
* 4
*** 3
*** 8
** 1
我现在只做了这个,它不起作用

def Function(List):
    s=''
    Count=0
    for element in List:
        Count+=1
        if type(element)==type([]):
            s+=Function(element)

        else:
            s+=Count*'*'+str(element)+('\n')


    return s
如果用打印件替换退货,它会向我报告错误。。。但如果我返回s,然后自己打印该字符串,它会正常工作,但再次不是它应该如何工作

>>> Function([2, 4, [[3, 8], 1]])
'*2\n*4\n*3\n*8\n**1\n'
>>> print('*2\n*4\n*3\n*8\n**1\n')
*2
*4
*3
*8
**1

哪里有问题,我找不到。我应该替换什么、删除什么等?

您需要将
count
传递给递归调用;局部变量不会神奇地转移到新函数调用:

def format_nested(lst, depth=1):
    s = []
    for element in lst:
        if isinstance(element, list):
            s.append(print_nested(element, depth + 1))
        else:
            s.append('{0} {1}\n'.format(depth * '*', element))
    return ''.join(s)
我用代码解决了其他各种问题:

  • 使用描述性函数和参数名称<代码>函数不是一个好名字
  • 使用列表构建字符串的元素,然后使用
    str.join()
    ;它比通过串联建立字符串要快
  • 仅在递归时增加深度计数器,而不是针对列表当前级别中的每个元素
  • 使用
    isinstance()
    测试特定类型
  • 字符串格式使与常量元素(如空格和换行符)一起构建字符串变得更加容易
演示:

输出:

*2
*4
***3
***8
**1

通常,将这些东西表示为生成器更容易

L = [2, 4, [[3, 8], 1]]

def nest_gen(L):
    if isinstance(L, list):
        for i in L:
            for j in nest_gen(i):
                yield "*"+str(j)
    else:
        yield L

for row in nest_gen(L):
    print(row)
在Python3.3+中,您可以使用
yield from

L = [2, 4, [[3, 8], 1]]

def nest_gen(L):
    if isinstance(L, list):
        yield from ("*"+str(j) for i in L for j in nest_gen(i))
    else:
        yield L

for row in nest_gen(L):
    print(row)
您可以将深度/项作为元组生成,而不是反复链接字符串

L = [2, 4, [[3, 8], 1]]

def nest_gen(L):
    if isinstance(L, list):
        yield from ((j+1, k) for i in L for j, k in nest_gen(i))
    else:
        yield 0, L

for item in nest_gen(L):
    print("{:*>{}} {}".format('', *item))

请不要调用您的函数
函数
,不要调用您的参数
列表
,不要对变量使用大写字母…您尝试过这个吗?我已经复制并粘贴了它,但它不起作用。退货有问题。是的,我试过了。请看演示。我确实在编辑周期的早期纠正了一个小错误,再次尝试复制和粘贴。我再次复制,它通过了,但它返回了我:print_nested([2,4,[[3,8],1]])Traceback(最近一次调用):File“”,第1行,in print_nested([2,4,[[3,8],1]])File“C:/Python30/b.py,第7行,in print_nested s.append('{}{}{}\n'。格式(depth*“*”,element))ValueError:格式为零长度的字段名然后您使用的是Python 2.6,而不是Python 3(并且
print
是一个语句,而不是一个函数)。我将进行更新。实际上我使用的是3.01这是我需要的:D但我应该在结尾打印字符串,不是每一步,而是在结尾
L = [2, 4, [[3, 8], 1]]

def nest_gen(L):
    if isinstance(L, list):
        yield from ("*"+str(j) for i in L for j in nest_gen(i))
    else:
        yield L

for row in nest_gen(L):
    print(row)
L = [2, 4, [[3, 8], 1]]

def nest_gen(L):
    if isinstance(L, list):
        yield from ((j+1, k) for i in L for j, k in nest_gen(i))
    else:
        yield 0, L

for item in nest_gen(L):
    print("{:*>{}} {}".format('', *item))