Dra*_*mon 96 python indexing list find
我的代码看起来像这样:
thing_index = thing_list.index(thing)
otherfunction(thing_list, thing_index)
好的,这样简化但你明白了.现在thing可能实际上不在列表中,在这种情况下我想传递-1作为thing_index.在其他语言中index(),如果找不到元素,这是您期望返回的内容.事实上,它抛出了一个ValueError.
我能做到这一点:
try:
    thing_index = thing_list.index(thing)
except ValueError:
    thing_index = -1
otherfunction(thing_list, thing_index)
但这感觉很脏,而且我不知道是否ValueError可以因为其他原因而被提出.我想出了基于生成器函数的以下解决方案,但它看起来有点复杂:
thing_index = ( [(i for i in xrange(len(thing_list)) if thing_list[i]==thing)] or [-1] )[0]
是否有更清洁的方法来实现同样的目标?我们假设列表没有排序.
Sil*_*ost 60
使用try-except子句没有任何"脏".这是pythonic的方式.ValueError将.index仅通过该方法引发,因为它是您在那里唯一的代码!
回答评论:
在Python中,更容易请求宽恕而不是获得权限哲学已经建立,并且不会 index因任何其他问题而引发此类错误.不是我能想到的.
Emi*_*nov 48
thing_index = thing_list.index(elem) if elem in thing_list else -1
一条线.简单.没有例外.
Ros*_*ers 16
该get类型有一个dict函数,如果字典中不存在该键,则第二个参数为list它应该返回的值.类似地,有getindexdefault,它返回get密钥存在时的值,否则它根据您的默认参数设置值,然后返回您的默认参数.
您可以扩展dict类型以获得list方法.
class SuperDuperList(list):
    def getindexdefault(self, elem, default):
        try:
            thing_index = self.index(elem)
            return thing_index
        except ValueError:
            return default
然后可以使用它,如:
mylist = SuperDuperList([0,1,2])
index = mylist.getindexdefault( 'asdf', -1 )
Ven*_*ddy 12
如果您经常这样做,那么最好将其存放在辅助函数中:
def index_of(val, in_list):
    try:
        return in_list.index(val)
    except ValueError:
        return -1 
那这个呢 :
li = [1,2,3,4,5] # create list 
li = dict(zip(li,range(len(li)))) # convert List To Dict 
print( li ) # {1: 0, 2: 1, 3: 2, 4:3 , 5: 4}
li.get(20) # None 
li.get(1)  # 0 
这个问题是语言哲学问题之一。例如,在 Java 中,一直有一个传统,即异常应该只在发生错误的“异常情况”中使用,而不是用于流量控制。一开始这是出于性能原因,因为 Java 异常很慢,但现在这已成为公认的风格。
相比之下,Python 一直使用异常来表示正常的程序流程,例如ValueError我们在这里讨论的引发 a 。在 Python 风格中,这并没有什么“肮脏”的地方,而且还有更多的地方。一个更常见的例子是StopIteration异常,它由迭代器的next()方法引发,以表示没有其他值。
您使用的代码没有任何问题ValueError.如果你想避免例外情况,这是另一个单线:
thing_index = next((i for i, x in enumerate(thing_list) if x == thing), -1)
| 归档时间: | 
 | 
| 查看次数: | 79842 次 | 
| 最近记录: |