0

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

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]

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

任何帮助,将不胜感激。

4

3 回答 3

2

像这样的东西可能会起作用:

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

试图以这种方式保存行是一个糟糕的想法 IMO。

于 2017-08-17T15:42:58.200 回答
1

列表理解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))
于 2017-08-17T15:28:57.087 回答
0

有时我发现一个镜头理解列表真的很难理解,尤其是当它们往往变得很长时。几周后,你或其他人将很难理解你试图做什么。

但是,不确定您是否可以一次性完成,但也许您可以尝试使用该map功能(将功能应用于列表的所有条款),然后使用filterand正确过滤结果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首先定义,这应该可以解决问题!

于 2017-08-17T16:05:42.667 回答