我需要从没有for
的列表中输出元组。请告诉我,我该怎么做?
我有一些n的所有排列的列表:
l = list(itertools.permutations(range(1, int(input()) + 1)))
并且我需要(例如,如果n = 2):
1 2
2 1
我尝试使用sum(l, [])
,但我不知道如何换行。
答案 0 :(得分:1)
l = list(itertools.permutations(range(1, int(input()) + 1)))
print(*l, sep='\n')
2
(1, 2)
(2, 1)
答案 1 :(得分:0)
不使用for
的简单版本是执行while
循环:
l = list(itertools.permutations(range(1, int(input()) + 1)))
i = 0
while i < len(l):
print(l[i])
i += 1
如果您不希望输出像一个示例输出那样是一个元组而是解压缩,则可以像下面的 kindall 所解释的那样打印解压缩的版本,如下所示:
i = 0
while i < len(l):
print(*l[i])
i += 1
答案 2 :(得分:-1)
从itertools.permutations
返回的是元组的迭代器(序列)。因此,如果迭代该结果,则每个项目都是一个元组。因此,以所需格式打印此数据的最直接方法是:
for p in l:
for x in p:
print(x, end=' ')
print()
但这不是一个循环,而是两个for
循环。幸运的是,内部循环是不必要的。您可以使用*
运算符解压缩元组,以便print
将其视为单独的参数:
for p in l:
print(*p)
现在,我们如何摆脱外部for
循环?好吧,我们可以使用其他一些进行迭代的构造,但它不是for
循环。例如,我们可以使用map
。
map(lambda p: print(*p), l)
在Python 2中,这就是您所需要的。您最终得到了一个不需要的None
值列表,但这没关系。我的意思是,这不是最佳选择,但是它将为您带来想要的结果。
在Python 3中,map()
实例化一个map
对象,并且直到您遍历该对象(通常使用for
循环)之前,实际上没有任何反应。没有for
循环的一种方法是使用any()
,它消耗迭代器中的项,直到达到真实值为止。 map
中的项目都是虚假的(lambda
返回None
),因此any()
将消耗掉所有这些项目。 map
对象中的“消耗”项将导致您的lambda被调用,从而打印每个排列。
any(map(lambda p: print(*p), l))
如果您以交互方式运行此代码,则会在要查找的值之后显示False
。那是any()
的返回值。您可以通过将其分配给变量来防止打印出来。
x = any(map(lambda p: print(*p), l))
这太过分了。这不是很好的Python代码。实际上,几乎所有语言都将是坏样式。但是它可以完成工作而没有for
循环...