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)
如果没有这样的匹配元素,将设置i
为None
.
以上不是一个有用的过滤器; 如果值'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"
.
简短回答:
my_list = [1, 2, 3]
[i for i in my_list if i==2]
Run Code Online (Sandbox Code Playgroud)
[i if i==2 else "wrong" for i in my_list]
Run Code Online (Sandbox Code Playgroud)
在列表理解中,循环变量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)
在 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)
归档时间: |
|
查看次数: |
71192 次 |
最近记录: |