如何将 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
函数(将函数应用于列表的所有项),然后正确过滤filter
和 partial
.
结果
假设 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=]
如何将这种循环转换为列表理解。
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
函数(将函数应用于列表的所有项),然后正确过滤filter
和 partial
.
假设 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=]