我有属性id的对象列表,我想找到具有特定id的对象的索引。我写了这样的话:
index = -1
for i in range(len(my_list)):
if my_list[i].id == 'specific_id'
index = i
break
但看起来不太好。还有更好的选择吗?
答案 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