如何知道列表中的哪个元素触发了any()函数?

时间:2015-08-01 07:04:26

标签: python python-2.7

我正在开发一个Python程序来检测记录列表中的城市名称。我到目前为止开发的代码如下:

func

该代码可以很好地检测会计记录中的aCities列表中的城市,但是any()函数只返回True或False我很难知道哪个城市(墨尔本,悉尼,珀斯,迪拜或伦敦)引发了退出。

我尝试过aCities.index和队列但到目前为止没有成功。

5 个答案:

答案 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

它有三个原因:

  1. any停在第一个真实(真实)项目
  2. and正在短路,因此如果not print(city)为真,则city in row[0]只会被评估为
  3. print返回None,因此not print(...)始终为True
  4. PS:正如@falsetru指出的那样,在Python 2.x中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