5

如何在 Python 中进行多行列表理解?就像是:

[
  x for x in a:
    if check(x):
      ....
      #something multiline here
      ....
    else: 
      ....
      #something multiline here
      ....
]

当然我知道我可以这样做:

def f(x):
  if check(x):
     ....
  else: 
     ....
 return x

map(a,f)

但我想要它没有额外的功能。

是否可以?

4

4 回答 4

5

我的理解是你不能按照你的建议去做。

与您建议的相比,当您命名函数并使用列表理解或映射函数时,它的可读性要高得多

于 2012-06-21T08:26:27.993 回答
2

你不能,以你的想法;列表推导只能包含表达式,不能包含语句。

于 2012-06-21T08:26:34.773 回答
0

您可以有多行列表推导,并且可以if在其中包含语句,但是语法与您显示的不同。我刚刚在解释器中测试了这个:

>>> tuple = ('a','b','c','d','e','f','g','h','i','j')
>>> list = [letter for letter in tuple
...         if (letter != 'a' and letter != 'b')]
>>> list
['c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']

你也可以用其他方式破坏它,但代码会有点混乱:

>>> list = [letter for letter in
...     tuple if (letter != 'j' and letter != 'i')]
>>> list
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']

正如其他人指出的那样,您可能不会使用else语句(无法使其在这里工作)。此外,如果列表理解开始增长太多,它就会失去简洁性(我认为这是最强点)。

于 2013-01-31T04:52:41.963 回答
-1

当然,您可以执行多个嵌套列表推导。我一直都这样做。这是一个例子:

    A=[[[10 for y in range(3)],2][x<=3] for x in range(7)]
    print A

它生成一个包含 4 乘以 2 的列表和三个以 3 乘以 10 作为元素的子列表。

    [2, 2, 2, 2, [10, 10, 10], [10, 10, 10], [10, 10, 10]]

如您所见,外部列表推导生成外部列表的 6 个元素,内部(第一个)列表推导生成内部 10 或 2,具体取决于 x 是否小于或等于 3。

于 2014-07-25T03:20:32.450 回答