>>> my_list = ["one","two","three"]
我希望创建一行代码来查找字符串。
例如,我有以下代码:
>>> [(i) for i in my_list if i=="two"]
['two']
但是当我观察变量时,它是错误的(我发现我的列表的最后一个值):
>>> print i
three
为什么我的变量包含的是最后一个元素,而不是我想要找到的那个元素?
>>> my_list = ["one","two","three"]
我希望创建一行代码来查找字符串。
例如,我有以下代码:
>>> [(i) for i in my_list if i=="two"]
['two']
但是当我观察变量时,它是错误的(我发现我的列表的最后一个值):
>>> print i
three
为什么我的变量包含的是最后一个元素,而不是我想要找到的那个元素?
您正在使用列表推导式生成过滤后的列表。即使已经从生成的列表中进行了筛选,i
仍然绑定到每个元素上,并且最后一个元素仍然是 'three'
。
您不应该使用列表推导式来挑选一个元素。只需使用一个for
循环,并使用break
结束它:
for elem in my_list:
if elem == 'two':
break
如果你必须使用一行代码(这与Python的哲学相悖,其中可读性至关重要),请使用next()
函数和生成器表达式:
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 i in my_list if i=="two"]
i
被迭代遍历 my_list
。当列表解析完成评估时,i
被赋值为迭代中的最后一项,即 "three"
。
i
只被赋值给了 old 中的最后一个项目。在 Python 3.x 中,变量作用域仅限于列表推导式内部,因此在推导式外部,您将看到 i
的先前值,或者如果它没有先前值,则未定义。 - Duncan在列表推导式中,循环变量i会变为全局变量。在for循环迭代之后,它成为指向列表中最后一个元素的引用。
如果你想要所有匹配项,那么将列表赋值给一个变量:
在列表推导式中,循环变量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
简短回答:
my_list = [1, 2, 3]
[i for i in my_list if i==2]
[i if i==2 else "wrong" for i in my_list]
在Python3中,当您尝试打印变量i时,它将超出作用域。
为了获得您想要的值,您应该将操作的结果存储在一个新变量中:
my_list = ["one","two","three"]
result=[ i for i in my_list if i=="two"]
print(result)
然后您将得到以下输出
['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'等于"three"的原因是因为"three"是上一次定义为I的内容
计算机执行了以下操作:
i = "one"
i = "two"
i = "three"
print(["two"])
因为你要求它这么做。
如果你想要索引,请点击这里。 如果你想要数组中的值,请定义数组,例如:
MyArray = [(i) for i in my_list if i=="two"]
Found this one:
[x for (i,x) in enumerate(my_list) if my_list[i] == "two"]
["two"]
你的代码
[(i) for i in my_list if i=="two"]
等于
a=[]
for i in my_list:
if i=="two":
a.append(i)
所以它遍历整个 my_list 并命中最后一个项目 "three",但仅返回等于 "two" 的内容并放入新列表中
[i for i in my_list if ...]
。如果你想要找到符合某些条件的一个项目,考虑使用next
; 例如:x = next(i for i in my_list if ...)
。 - khelwood"two" in mylist
(它将返回一个布尔值)或者mylist.index("two")
(它将返回找到的字符串所在的位置)?既然你已经拥有了你要查找的字符串,那么重复返回它的搜索结果是毫无意义的,不是吗? - Tim Pietzcker