Python for和if在一行上

时间:2015-09-15 07:47:11

标签: python python-2.7 for-loop if-statement list-comprehension

我遇到了python问题。

我列出了一个简单的清单:

>>> my_list = ["one","two","three"]

我想创建一个"单行代码"找到一个字符串。

例如,我有这段代码:

>>> [(i) for i in my_list if i=="two"]
['two']

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

>>> print i
three

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

6 个答案:

答案 0 :(得分:16)

您正在使用列表推导生成过滤列表i仍然绑定到该列表的每个元素,最后一个元素仍为'three',即使它后来从正在生成的列表中过滤掉。

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

for elem in my_list:
    if elem == 'two':
        break

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

i = next((elem for elem in my_list if elem == 'two'), None)

如果没有这样的匹配元素,会将i设置为None

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

elem = 'two' if 'two' in my_list else None

答案 1 :(得分:11)

执行时

>>> [(i) for i in my_list if i=="two"]

i遍历列表my_list。当列表推导完成评估时,i被分配给迭代中的最后一项,即"three"

答案 2 :(得分:4)

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

如果您想要所有匹配项,请将列表分配给变量:

filtered =  [ i for i in my_list if i=='two']

如果您只想要第一场比赛,可以使用函数发生器

try:
     m = next( i for i in my_list if i=='two' )
except StopIteration:
     m = None

答案 3 :(得分:1)

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

要获取所需的值,应将操作结果存储在新变量中:

my_list = ["one","two","three"]
result=[(i) for i in my_list if i=="two"]
print(result)

然后您将获得以下输出

['two']

答案 4 :(得分:0)

找到了这个:

[x for (i,x) in enumerate(my_list) if my_list[i] == "two"]

将打印:

["two"]

答案 5 :(得分:0)

它显示“三”的原因是因为您没有定义数组。等同于您正在做的事情:

arr = []
for i in array :
    if i == "two" :
        arr.push(i)
print(i)

您要查询的是它经过的最后一个元素,这不是您应该做的。您需要将数组存储到变量中才能获取元素。

您正在做的英语翻译是:

You: "I need you to print all the elements in this array that equal two, but in an array. And each time you cycle through the list, define the current element as I."
Computer: "Here: ["two"]"
You: "Now tell me 'i'"
Computer: "'i' is equal to "three"
You: "Why?"

“ i”等于“三”的原因是因为三是最后定义为I的东西

计算机做到了:

i = "one"
i = "two"
i = "three"

print(["two"])

因为您要求这样做。

如果需要索引,请转到here 如果需要数组中的值,请定义数组,如下所示:

MyArray = [(i) for i in my_list if i=="two"]