如何从属性中找到列表中 class 实例的索引
How to find the index of a class instance in a list from the attribute
我有一个 class 的所有实例的列表。我试图在给定属性值的情况下找出该列表中实例的索引。
例如。我有以下代码:
class Test():
all_objects=[]
def __init__(self,name,age):
self.name = name
self.age = age
Test.all_objects.append(self)
Test("joe",23)
Test("kate",16)
Test("adam",56)
#this is ugly ..
for ind,item in enumerate(Test.all_objects):
if item.name == 'joe':
print(ind)
我可以通过遍历列表中的每个元素找到实例的索引。 有更好的方法吗?(也许以某种方式使用 index() 方法)
澄清:
我正在寻找一种无需遍历 all_objects
列表即可执行此操作的方法。看看下面的评论和答案,似乎没有办法解决这个问题。
感谢大家为我确认这一点。
使用函数式编程⬇
my_filter = filter(lambda x: x[1].name == 'joe', enumerate(Test.all_objects))
print(next(my_filter)[0])
一个班轮⬇
print(next(filter(lambda x: x[1].name == 'joe', enumerate(Test.all_objects)))[0])
一个班轮并在找不到指定实例时打印 Not Found
⬇
print(next(filter(lambda x: x[1].name == 'joe', enumerate(Test.all_objects)))[0], 'Not Found')
如果您想多次搜索,可以使用 name
及其关联对象创建字典:
objects = {i.name: i for i in Test.all_objects}
现在您可以通过名称访问对象:
a = objects['joe']
显然,如果有多个对象具有相同的对象,那是行不通的 name
您可以使用 defaultdict 来克服它:
from collections import defaultdict
objects = defaultdict(list)
for i in Test.all_objects:
objects[i.name].append(i)
现在每个键都有一个对象列表。
我有一个 class 的所有实例的列表。我试图在给定属性值的情况下找出该列表中实例的索引。
例如。我有以下代码:
class Test():
all_objects=[]
def __init__(self,name,age):
self.name = name
self.age = age
Test.all_objects.append(self)
Test("joe",23)
Test("kate",16)
Test("adam",56)
#this is ugly ..
for ind,item in enumerate(Test.all_objects):
if item.name == 'joe':
print(ind)
我可以通过遍历列表中的每个元素找到实例的索引。 有更好的方法吗?(也许以某种方式使用 index() 方法)
澄清:
我正在寻找一种无需遍历 all_objects
列表即可执行此操作的方法。看看下面的评论和答案,似乎没有办法解决这个问题。
感谢大家为我确认这一点。
使用函数式编程⬇
my_filter = filter(lambda x: x[1].name == 'joe', enumerate(Test.all_objects))
print(next(my_filter)[0])
一个班轮⬇
print(next(filter(lambda x: x[1].name == 'joe', enumerate(Test.all_objects)))[0])
一个班轮并在找不到指定实例时打印 Not Found
⬇
print(next(filter(lambda x: x[1].name == 'joe', enumerate(Test.all_objects)))[0], 'Not Found')
如果您想多次搜索,可以使用 name
及其关联对象创建字典:
objects = {i.name: i for i in Test.all_objects}
现在您可以通过名称访问对象:
a = objects['joe']
显然,如果有多个对象具有相同的对象,那是行不通的 name
您可以使用 defaultdict 来克服它:
from collections import defaultdict
objects = defaultdict(list)
for i in Test.all_objects:
objects[i.name].append(i)
现在每个键都有一个对象列表。