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

时间:2013-10-03 14:48:21

标签: python list indexing

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

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

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

5 个答案:

答案 0 :(得分:25)

如果您想要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)

答案 1 :(得分:8)

Herr的另一种选择是不使用(显式)循环,使用两种不同的方法来生成“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

答案 2 :(得分:6)

您可以使用enumerate

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

答案 3 :(得分:0)

假设

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)] 

答案 4 :(得分: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