我正在开发一个Python程序来检测记录列表中的城市名称。我到目前为止开发的代码如下:
func
该代码可以很好地检测会计记录中的aCities列表中的城市,但是any()函数只返回True或False我很难知道哪个城市(墨尔本,悉尼,珀斯,迪拜或伦敦)引发了退出。
我尝试过aCities.index和队列但到目前为止没有成功。
答案 0 :(得分:10)
我认为any
无法做到这一点。您可以将next
与默认值一起使用:
for row in cxTrx.fetchall() :
city = next((city for city in aCities if city in row[0]), None)
if city is not None:
#print the name of the city that fired the any() function
else :
# no city name found in the accounting record
答案 1 :(得分:4)
你不会因为any
只返回一个布尔值。但您可以使用next
:
city = next((city for city in aCities if city in row[0]), None)
if city:
...
使用此语法,您将找到第一个city
,它是存储在数据库行中的描述的子字符串。如果没有,则第二个参数例如没有,将被退回。
答案 2 :(得分:3)
不,any
可以 。这有点像噱头 - 它看起来很有趣" - 但确实有效:
if any(city in row[0] and not print(city) for city in aCities):
# city in row[0] found, and already printed :)
# do whatever else you might want to do
else:
# no city name found in the accounting record
或者更简洁,如果您真正想做的就是打印这座城市:
if not any(city in row[0] and not print(city) for city in aCities):
# no city name found in the accounting record
它有三个原因:
any
停在第一个真实(真实)项目and
正在短路,因此如果not print(city)
为真,则city in row[0]
只会被评估为print
返回None
,因此not print(...)
始终为True
。print
不是一个函数,所以你必须首先说:
from __future__ import print_function
正如我所说,它有三个原因 - Python 3 原因;)哦,等等 - 这有4个原因...
答案 3 :(得分:1)
为了完整起见,这是一个带有标准for循环的解决方案:
for city in aCities:
if city in row[0]:
print 'Found city', city
break
else:
print 'Did not find any city'
这应该具有与any
相同的短路行为,因为它在满足条件时会脱离for循环。当for循环运行到结束而不中断时,else
部分被执行,请参阅this question。
虽然此解决方案使用更多行,但实际上使用的字符数少于其他解决方案,因为没有调用next(..., None)
,它没有额外的city =
赋值,也没有第二个{ {1}}(以一个额外的if city is None
为代价)。当事情变得更复杂时,有时可以更明确地写出for循环,然后将一些生成器表达式和break
语句串起来。
答案 4 :(得分:1)
我的回答仅适用于 Python >= 3.8。您可以使用 Walrus Operator (:=
) 来实现此目的:
for row in cxTrx.fetchall() :
if any( (t_city := city) in row[0] for city in aCities ) :
#print the name of the city that fired the any() function
print(t_city)
else :
# no city name found in the accounting record
注意 t_city := city
周围的括号很重要,因为如果不放,t_city
会得到值 True
,也就是表达式 city in row[0]
中的值最后一次迭代(以防 any
被触发)
海象运算符是在 Python 3.8 中引入的:What's new in Python 3.8