从列表中输出元组,不带“ for”

时间:2019-10-21 22:54:27

标签: python tuples

我需要从没有for的列表中输出元组。请告诉我,我该怎么做?

我有一些n的所有排列的列表:

l = list(itertools.permutations(range(1, int(input()) + 1)))

并且我需要(例如,如果n = 2):

1 2
2 1

我尝试使用sum(l, []),但我不知道如何换行。

3 个答案:

答案 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循环...