26

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

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

但它看起来不太好。有没有更好的选择?

4

5 回答 5

50

enumerate当您想要for循环中的值和索引时使用:

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

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

index = next((i for i, item in enumerate(my_list) if item.id == 'specific_id'), -1)
于 2013-10-03T14:50:05.887 回答
11

这是一个不使用(显式)循环的替代方案,使用两种不同的方法从原始列表生成“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
于 2013-10-03T15:05:52.950 回答
7

您可以使用enumerate

for index, item in enumerate(my_list):
    if item.id == 'specific_id':
        break
于 2013-10-03T14:49:59.167 回答
0

__eq__为您的班级实施方法

class MyCls:
   def __init__(self, id):
       self.id = id

   def __eq__(self, other):
       # comparing with str since you want to compare
       # your object with str

       if not isinstance(other, str):
           raise TypeError("MyCls can be compared only with str")
       if other == self.id:
           return True
       return False

现在你可以做类似的事情

my_list = [MyCls(i) for i in 'abcdef']
print(my_list.index('c'))

这将返回索引 2。它的行为类似于普通 list.index 方法的行为。即如果它没有找到索引,它会引发一个ValueError

于 2021-02-11T14:20:41.073 回答
-1

假设

a = [1,2,3,4]
val = 3

a.index(val) if val in a else -1

对于多次出现,根据以下 Azam 的评论:

[i if val == x else -1 for i,x in enumerate(a)] 

Edit1:对于每个评论其对象列表的人,您只需要访问id

[i if val == x.id else -1 for i,x in enumerate(a)] 
于 2017-05-27T06:09:55.590 回答