Python for 和 if 在一行

Python for and if on one line

我对 python 有疑问。

我列了一个简单的清单:

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

我想创建一个 "single line code" 来查找字符串。

例如,我有这个代码:

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

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

>>> print i
three

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

当你执行

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

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

您正在使用列表推导生成过滤列表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

在列表理解中,循环变量 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

找到这个:

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

将打印:

["two"]

它打印“三”的原因是因为你没有定义你的数组。相当于你正在做的是:

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"]

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

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

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

然后您将得到以下输出

['two']

简答:

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

你的代码

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

等于

a=[]
for i in my_list:
  if i=="two":
    a.append(i)

因此它遍历整个 my_list 并命中最后一项“三”但只返回等于“二”的内容并放入一个新列表