使用if语句进行列表理解


106

我想比较2个可迭代项并打印出现在两个可迭代项中的项目。

>>> a = ('q', 'r')
>>> b = ('q')


# Iterate over a. If y not in b, print y.
# I want to see ['r'] printed.
>>> print([ y if y not in b for y in a])
                              ^

但这给我一个无效的语法错误,该错误^已放置在处。这个lamba函数有什么问题?


5
下面的所有答案都是正确的,但也b = ('q')不会创建元组。具有一个元素的元组需要一个显式的,,即b = ('q',)
dmg

我已经变成tuplesiterables
OrangeTux

Answers:


187

您下的订单错了。在if应后的for(除非它是在if-else三元运算符)

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

但是,这将起作用:

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

谢谢。我看到了这篇文章stackoverflow.com/questions/4406389/…关于lambda函数中的if else语句。而且我认为仅使用if语句(不包含else语句)将以相同的顺序工作。
OrangeTux

39

您将放到if最后:

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

列表解析的编写顺序与其嵌套的完整指定副本的编写顺序相同,实质上,以上声明翻译为:

outputlist = []
for y in a:
    if y not in b:
        outputlist.append(y)

您的版本尝试这样做:

outputlist = []
if y not in b:
    for y in a:
        outputlist.append(y)

但是列表理解必须至少从一个外部循环开始。


您一直很有帮助。谢谢。
TolgahanÜZÜN17年

7

清单理解公式:

[<value_when_condition_true> if <condition> else <value_when_condition_false> for value in list_name]

因此您可以这样做:

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

仅用于演示目的:[如果y不在b中,则为y;对于a中的y,为False]


2
您不能else在列表理解中放一个,至少不能放一个。不要将列表理解(过滤)与条件表达式(必须具有一个值,使else表达式成为必需的)混淆。
马丁·皮特斯

同意。else如代码所示,用于列表理解。
Vishvajit Pathak

2
那是一个条件表达式。它可以在任何有效表达式适用的地方使用。它不特定于列表理解。
马丁·皮特斯

5

这不是lambda函数。这是一个列表理解。

只需更改顺序:

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

-2

我针对我的情况研究并尝试了上述提及的列表理解建议,如下所述,但是它没有用。我在这里做错了什么?

sent_splt=[['good', 'case,', 'excellent', 'value.'], ['great', 'for', 'the', 'jawbone.'],['tied', 'to', 'charger', 'for', 'conversations', 'lasting', 'more', 'than', '45', 'minutes.major', 'problems!!']]

stop_set = ['the', 'a', 'an', 'i', 'he', 'she', 'they', 'to', 'of', 'it', 'from']

x=[a for a in sent_splt if a not in stop_set]
print(x)

它不是在过滤单词。


1
您需要做的是问一个问题。没有发布答案。
Whirl Mind

实际上,这是说从过去的2天休息1天后对我发布问题。基本上,由于我之前的问题(不是按照stackoverflow标准),我不被允许发布问题。抱歉给您带来不便。
迪帕克·迪曼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.