用Python方法检查哪个变量等于零?

时间:2018-08-29 01:52:26

标签: python

找到哪个给定变量等于零的最佳方法是什么?我可以这样做,但这不会告诉我哪个变量等于零。

if 0 in (a, b, c, d, e):
    do something

3 个答案:

答案 0 :(得分:7)

如果您完全处于这种情况,则表明您可能应该使用列表或其他数据结构来代替5个变量。

您甚至如何以程序可以使用的方式表示“变量c是那个信息”? which_one_was_it = c?只需将which_one_was_it设置为0(或从技术上说,可能是0.0或类似的值)。 which_one_was_it = 'c'?您将如何处理字母'c'?即使您滥用evallocals,您所能做的就是再次获取该值。 evalexeclocals不能用于重新分配局部变量。

相反,如果您有一个由5个元素组成的列表,index = l.index(0)会告诉您第一个索引的值等于0,而l[index] = 5可以用来设置该索引处的值。

答案 1 :(得分:0)

或列表理解:

print([do something for i in (a,b,c,d,e) if i == 0])

或者:

print([do something for i in (a,b,c,d,e) if not i])

或生成器(将list(..)转换为list):

print((do something for i in (a,b,c,d,e) if not i))

得到哪个:

>>> a=0
>>> b=1
>>> c=0
>>> d=1
>>> e=0
>>> [k for k,v in globals().items() if not v]
['__doc__', '__package__', '__spec__', '__annotations__', 'a', 'c', 'e']
>>> [k for k,v in globals().items() if v==0]
['a', 'c', 'e']
>>> 

答案 2 :(得分:0)

为了便于讨论,我假设您只是想知道零在哪里出现,而不是变量的确切名称。在很多情况下,知道变量的实际名称比重写您正在执行的任何操作要好,这样您就无需显式使用该名称。

如果只想要第一个,则pythonic方法是使用try / except块和内置方法来检查包含。就个人而言,我不喜欢为此使用4行,因此我将其包装在名为index_or_default()的方法中,或类似的方法。不过每个人都有。

try:
    i = (a, b, c).index(0)
except IndexError:
    i = None

您可以轻松地循环获取所有此类索引,或者更好的是使用自己的生成器:

def zero_indices(L):
    for i, x in enumerate(L):
        if x == 0:
            yield i

for i in zero_indices((a, b, c)):
    # do stuff with i

如果您拥有像numpy这样重量级的依赖项,则可以依靠内置的矢量化操作来真正快速地完成类似的事情:

for i in np.argwhere(np.equal((a, b, c), 0)):
    # do stuff with i