逐行打印嵌套列表而不进行for循环

时间:2017-02-07 19:40:04

标签: python list python-3.x nested

我可以使用for循环和"逐行打印嵌套列表。 " .join()将嵌套列表中的每个int映射到带有map()的str。

示例:

>>> ys = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
>>> for xs in ys:
...     print(" ".join(map(str, xs)))
... 
1 2 3
4 5 6
7 8 9 10

但是我试图弄清楚如何在没有可以支持任意长度的内部列表的for循环的情况下再次执行此操作。有什么建议?

3 个答案:

答案 0 :(得分:3)

由于深度已知且已修复,因此您可以使用map将2个lambda语句嵌套在一行中,以避免理解(这将涉及for循环)

ys = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
print("\n".join(map(lambda xs : " ".join(map(str, xs)),ys)))

没有for循环,至少没有可见。

从性能的角度来看,map执行循环但是可以编译,因此速度更快。另一方面,join需要知道输入的大小,因此无论如何都会从迭代中创建list,而join + 列表理解是然后更快(不是在Python {2} map返回list)。总之:使用timeit确定您的上下文中最快的变体。

答案 1 :(得分:1)

ys = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
print "\n".join( [" ".join(map(str,subList)) for subList in ys] )

代码说明:

[" ".join(map(str,subList)) for subList in ys]

这创建了一个字符串列表,每个列表的每个值与一个空格组合在一起。

["1 2 3", "4 5 6", "7 8 9 10"]

之后

"\n".join()非常自我解释。

编辑:

已更新为使用lambda而不是for

ys = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
print "\n".join( map(lambda x: " ".join(map(str,x)),ys) )

答案 2 :(得分:1)

作为任何长度/深度列表的递归函数:

def recursive_print_list(param):
    while len(param) > 0:
        if isinstance(param[0], list):
            recursive_print_list(param[0])
            print("")
            param = param[1:]
        else:
            print(param[0], '', end='')
            param = param[1:]

值得注意的是,其他两个答案对深度不起作用>这会的。它还依赖print()隐式转换为字符串,因此只要print(element)所有元素都可以使用任何混合输入。

原始答案:

xs = ys[:]  # copy the original list, as this method is destructive
while True:
    try:
        print " ".join(map(str, xs[0]))
        xs = xs[1:]
    except IndexError:
        break

将适用于任意嵌套的int列表。

您也可以使用相同的方法来避免地图调用: Python 3:

xs = ys[:]
while True:
    if len(xs) == 0:
        break
    subl = xs[0][:]
    while True:
        try:
            print(subl[0], ' ', sep='', end='')
            subl = subl[1:]
        except IndexError:
            print("")
            break
    xs = xs[1:]

Python 2.7:

xs = ys[:]
while True:
    if len(xs) == 0:
        break
    subl = xs[0][:]
    while True:
        try:
            print subl[0],
            subl = subl[1:]
        except IndexError:
            print ""
            break
    xs = xs[1:]
相关问题