如何将 if/else 语句与多个支持表达式一起放入列表理解中

How to put if/else statements in list comprehension along with multiple supporting expressions

如何将这种循环转换为列表理解。

for x in email_data:
    data = Apply_Filters(x[0])
    if len(data.split()) > 1:
        email_data2.append(tuple([x[1], data]))

到目前为止,我的搜索让我理解了只有 if else 语句而没有执行任何其他功能,如 .

[y if y not in b else other_value for y in a]

但我首先必须将函数应用于循环变量,然后必须使用条件结构。

如有任何帮助,我们将不胜感激。

列出对 email_data2 的理解:

email_data2 = [(y, Apply_Filters(x)) for x, y in email_data
                                        if len(Apply_Filters(x).split()) > 1]

上面的列表理解不是特别有效,因为Apply_Filters(x)必须在每次迭代中计算两次

在这种情况下,显式 for 循环会更好(特别是如果 Apply_Filters(x) 是一个 高成本 函数):

email_data2 = []
for x, y in email_data:
    data = Apply_Filters(x)
    if len(data.split()) > 1:
        email_data2.append((y, data))

类似这样的方法可能有效:

[(x_1, data) for x_1, data in map(lambda x: (x[1], Apply_Filters(x[0])), email_data) if len(data.split()) > 1]

在我看来,尝试以这种方式保存行是个糟糕的主意。

有时我发现 一次性理解列表 真的很难理解,尤其是当它们变得很长时。几周后,您或其他人将很难理解您尝试做的事情。

不确定是否可以一次完成,但也许您可以尝试 map 函数(将函数应用于列表的所有项),然后正确过滤filterpartial.

结果

假设 list1 是您的初始列表:

from functools import partial
from operator import is_not

def f1(x):
  data = Apply_Filters(x[0])
  if len(data.split()) > 1:
    return tuple([x[1], data])

# so it will give you in one line
list(filter(partial(is_not, None), list(map(f1, list1)))

# in several steps
list2 = list(map(f1, list1)) # you apply f1 function to all elements of list1. Pb: you get a few None object in list2 (because you did not specify what to do if the `if` condition is not valid
list3 = list(filter(partial(is_not, None), list2)) # so, you remove the None elements from your list 

如果您的目标确实是仅用一行动态定义列表,当然,如果您首先定义了 f1,这应该可以解决问题![​​=16=]