我可以使用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循环的情况下再次执行此操作。有什么建议?
答案 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:]