找到哪个给定变量等于零的最佳方法是什么?我可以这样做,但这不会告诉我哪个变量等于零。
if 0 in (a, b, c, d, e):
do something
答案 0 :(得分:7)
如果您完全处于这种情况,则表明您可能应该使用列表或其他数据结构来代替5个变量。
您甚至如何以程序可以使用的方式表示“变量c
是那个信息”? which_one_was_it = c
?只需将which_one_was_it
设置为0(或从技术上说,可能是0.0或类似的值)。 which_one_was_it = 'c'
?您将如何处理字母'c'
?即使您滥用eval
或locals
,您所能做的就是再次获取该值。 eval
,exec
和locals
不能用于重新分配局部变量。
相反,如果您有一个由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