【问题标题】:Multi-variable List Comprehension多变量列表理解
【发布时间】:2013-01-03 04:57:27
【问题描述】:

我正在研究Project Euler #35,我需要找到一个数字的循环排列。使用itertools,我可以很容易地得到一个数字的排列。但是,我想用列表推导来做(因为它看起来更像 Pythonic;我也在尝试熟悉列表推导)。

我发现所有的圆素数只能包含数字 1、3、7 和 9(这不包括 2 和 5,它们根据定义是圆素数)。如果数字(0、2、4、5、6 或 8)中有任何其他数字,则其中一个排列将不是素数(因为该数字将在至少一个排列中的最后一个)。

因此,我尝试这样做:

from itertools import permutations
l = [x for x in list(permutations('1397', y)) for y in range(7)]

我需要使用y for y in range(7) 以便获得不同长度的排列。

但是,这给了我一个TypeError

Traceback (most recent call last):
  File "<pyshell#23>", line 1, in <module>
    l = [x for x in list(permutations('1397', y)) for y in range(7)]
TypeError: an integer is required

这可行,但它没有在一个列表理解中使用两个变量:

l = []
for y in range(7):
    l.append([x for x in list(permutations('1379', y))])

如何进行双变量列表理解?谢谢!

【问题讨论】:

  • 提示:嵌套列表推导与嵌套循环具有相同的for 顺序。 for y in range(7): for x in permutations('1397', y): newlist.append(x) 变为 newlist = [x for y in range(7) for x in permutations('1397', y)]
  • list(permutations('1379', y)) 已经是一个列表,for-loop: [x for x in list(permutations('1379', y))] 没用。
  • 您根本不应该使用 itertools.permitations。问题是找到循环排列,这是一种特殊的排列。在没有 itertools.permutation 的情况下直接生成它们要容易得多(否则您将需要过滤结果)。同样使用特殊的 Python 标准库函数也不适合像您要解决的练习这样的练习

标签: python list list-comprehension


【解决方案1】:

for y in range(7) 部分应位于置换循环之前。:

l = [x for y in range(7) for x in list(permutations('1397', y))]

上面的列表推导等价于:

In [93]: l = []

In [94]: for y in range(7):
    ...:     l.extend(list(permutations('1397', y)))

例如:

In [76]: l = [x for y in range(3) for x in list(permutations('1397', y))]

In [77]: l
Out[77]: 
[(),
 ('1',),
 ('3',),
 ('9',),
 ('7',),
 ('1', '3'),
 ('1', '9'),
 ('1', '7'),
 ('3', '1'),
 ('3', '9'),
 ('3', '7'),
 ('9', '1'),
 ('9', '3'),
 ('9', '7'),
 ('7', '1'),
 ('7', '3'),
 ('7', '9')]

还有用于您的工作示例的 list-comprehension 版本,

l = []
for y in range(7):
    l.append(list(permutations('1397', y)))

是:

In [85]: l = [list(permutations('1397', y)) for y in range(3)]

In [86]: l
Out[86]: 
[[()],
 [('1',), ('3',), ('9',), ('7',)],
 [('1', '3'),
  ('1', '9'),
  ('1', '7'),
  ('3', '1'),
  ('3', '9'),
  ('3', '7'),
  ('9', '1'),
  ('9', '3'),
  ('9', '7'),
  ('7', '1'),
  ('7', '3'),
  ('7', '9')]]

【讨论】:

    【解决方案2】:
    [list(permutations('1397',x)) for x in range(7)]
    

    【讨论】:

    • 这个结果是一样的,因为原来的问题有[x for x in ...]。在我看来,这个想法是有一个嵌套的列表理解,这将允许像[x*x for x in ...] 这样的东西,这在这个答案中是不可能的。也许您可以简单地用“不要使用嵌套列表推导式,只需使用以下内容:”来介绍您的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 2015-12-18
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多