在Python中按属性获取对象列表中的索引

seb*_*szw 14 python indexing list

我有具有属性id的对象列表,我想找到具有特定id的对象的索引.我写了这样的东西:

index = -1
for i in range(len(my_list)):
    if my_list[i].id == 'specific_id'
        index = i
        break
Run Code Online (Sandbox Code Playgroud)

但它看起来不太好.还有更好的选择吗?

Joe*_*ett 26

使用enumerate时,你在想这两个值和指数for环:

for index, item in enumerate(my_list):
    if item.id == 'specific_id':
        break
else:
    index = -1
Run Code Online (Sandbox Code Playgroud)

或者,作为生成器表达式:

index = next((i for i, item in enumerate(my_list) if item.id == 'specific_id'), -1)
Run Code Online (Sandbox Code Playgroud)

  • 但"-1"是有效的索引值.如果您的代码找不到匹配项,它将返回-1的索引,并引导某人获取列表的最后一个元素,就好像它匹配一样. (3认同)

che*_*ner 9

这是一个不使用(显式)循环的替代方法,使用两种不同的方法从原始列表生成"id"值列表.

try:
    # index = map(operator.attrgetter('id'), my_list).index('specific_id')
    index = [ x.id for x in my_list ].index('specific_id')
except ValueError:
    index = -1
Run Code Online (Sandbox Code Playgroud)

  • 不,这似乎是一个灾难性的答案。我似乎不仅假设存在一个“list.find”(类似于“str.find”和“str.index”方法对),而且还混淆了哪个引发“ValueError”(它是“str.find”)。 index`,而不是`str.find`)并返回-1。现在更正为“list.index”。 (2认同)

Dan*_*man 6

你可以使用enumerate:

for index, item in enumerate(my_list):
    if item.id == 'specific_id':
        break
Run Code Online (Sandbox Code Playgroud)