Python for和if在一行上

ros*_*nik 15 python for-loop if-statement list-comprehension python-2.7

我有python的问题.

我做了一个简单的清单:

>>> my_list = ["one","two","three"]
Run Code Online (Sandbox Code Playgroud)

我想创建一个"单行代码"来查找字符串.

例如,我有这个代码:

>>> [(i) for i in my_list if i=="two"]
['two']
Run Code Online (Sandbox Code Playgroud)

但是当我看到变量是错误的时(我找到了我的列表的最后一个值):

>>> print i
three
Run Code Online (Sandbox Code Playgroud)

为什么我的变量包含最后一个元素而不是我想要找到的元素?

Mar*_*ers 20

您正在使用列表推导生成筛选列表.i仍然被绑定到该列表的每个元素,并且最后一个元素仍然是'three',即使它随后从正在生成的列表中被过滤掉.

您不应该使用列表推导来挑选一个元素.只需使用一个for循环,并break结束它:

for elem in my_list:
    if elem == 'two':
        break
Run Code Online (Sandbox Code Playgroud)

如果你必须有一个单行(这将违背Python的哲学,可读性很重要),使用next()函数和生成器表达式:

i = next((elem for elem in my_list if elem == 'two'), None)
Run Code Online (Sandbox Code Playgroud)

如果没有这样的匹配元素,将设置iNone.

以上不是一个有用的过滤器; 如果值'two'在列表中,您实质上是在测试.你可以用in它:

elem = 'two' if 'two' in my_list else None
Run Code Online (Sandbox Code Playgroud)


Con*_* Ma 16

当你表演

>>> [(i) for i in my_list if i=="two"]
Run Code Online (Sandbox Code Playgroud)

i在列表中迭代my_list.当列表推导完成评估时,i将分配给迭代中的最后一项,即"three".

  • “其他”怎么样? (2认同)

Jin*_*Jin 8

简短回答:

  1. 带 if 语句的一行循环
my_list = [1, 2, 3]
[i for i in my_list if i==2]
Run Code Online (Sandbox Code Playgroud)
  1. 一行循环同时包含 if 和 else 语句。不幸的是,我们不能像上面那样将 if-else 语句放在最后。
[i if i==2 else "wrong" for i in my_list]
Run Code Online (Sandbox Code Playgroud)


des*_*ato 7

在列表理解中,循环变量i变为全局变量。在for循环中迭代之后,它是对列表中最后一个元素的引用。

如果需要所有匹配项,则将列表分配给变量:

filtered =  [ i for i in my_list if i=='two']
Run Code Online (Sandbox Code Playgroud)

如果只需要第一个匹配项,则可以使用函数生成器

try:
     m = next( i for i in my_list if i=='two' )
except StopIteration:
     m = None
Run Code Online (Sandbox Code Playgroud)


Ame*_*aif 5

在 python3 中,当您尝试打印变量 i 时,它将超出范围。

要获得您想要的值,您应该将操作结果存储在一个新变量中:

my_list = ["one","two","three"]
result=[ i for i in my_list if i=="two"]
print(result)
Run Code Online (Sandbox Code Playgroud)

然后你会得到以下输出

['two']
Run Code Online (Sandbox Code Playgroud)