【问题标题】:How to find the index of a class instance in a list from the attribute如何从属性中查找列表中类实例的索引
【发布时间】:2022-01-08 01:39:09
【问题描述】:

我有一个类的所有实例的列表。在给定属性值的情况下,我试图找出该列表中实例的索引。

例如。我有以下代码:

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 列表的方法。看看下面的 cmets 和答案,似乎没有办法解决这个问题。

感谢大家为我确认这一点。

【问题讨论】:

  • [obj.name for obj in Test.all_objects].index('joe')?
  • 没有迭代就没有办法。
  • 如果实例名称应该是唯一的,也许您想使用字典而不是 all_objects 的列表?
  • 它并不难看——它非常可读——我只使用这种方法作为首选。

标签: python python-3.x list class oop


【解决方案1】:

使用函数式编程⬇

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

【讨论】:

    【解决方案2】:

    如果您想多次搜索,可以使用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)
    

    现在每个键都有一个对象列表。

    【讨论】:

      猜你喜欢
      • 2017-12-08
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 2018-06-03
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多