我有属性 id 的对象列表,我想找到具有特定 id 的对象的索引。我写了这样的东西:
index = -1
for i in range(len(my_list)):
if my_list[i].id == 'specific_id'
index = i
break
但它看起来不太好。有没有更好的选择?
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)
这是一个不使用(显式)循环的替代方案,使用两种不同的方法从原始列表生成“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
您可以使用enumerate
:
for index, item in enumerate(my_list):
if item.id == 'specific_id':
break
__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
假设
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)]