Это в принципе работает, но выглядит глупо.
Не глупо, просто неопытно.
Я надеялся, что есть способ использовать понимание списка или генераторов , чтобы сделать его красивее.(...) Я подозреваю есть лучший способ сделать это.
Безусловно, ваша интуиция была хороша.
Простой способулучшение:
class Foo:
dicfoos = {}
def __init__(self, name, data):
self.name = str(name)
self.data = list(data)
self.__class__.dicfoos.setdefault(self.name,[]).append(self)
foo1 = Foo('abc', [1, 2, 3])
foo2 = Foo('def', [4, 5, 6])
foo3 = Foo('ghi', [7, 8, 9])
foo4 = Foo('def', [10, 11, 12])
def test(klass,the_name, wanted_data):
return (the_name,
tuple( x for foo in klass.dicfoos.get(the_name,())
for x in foo.data if x in wanted_data ) )
print test(Foo,'zzz', [2, 3, 4, 5, 11])
print test(Foo,'def', [2, 3, 4, 5, 11])
print test(Foo,'abc', [2, 3, 4, 5, 11])
результат
('zzz', ())
('def', (4, 5, 11))
('abc', (2, 3))
Немного более сложный способ сделать:
class Foo:
dicfoos = {}
def __init__(self, name, data):
self.name = str(name)
self.data = list(data)
self.__class__.dicfoos.setdefault(self.name,[]).append(self)
def sift(self,daataa):
for n in self.data:
if n in daataa: yield n
foo1 = Foo('abc', [1, 2, 3])
foo2 = Foo('def', [4, 5, 6])
foo3 = Foo('ghi', [7, 8, 9])
foo4 = Foo('def', [10, 11, 12])
def test(klass,the_name,wanted_data):
return (the_name,
tuple( x for foo in klass.dicfoos.get(the_name,())
for x in foo.sift(wanted_data) ) )
print test(Foo,'zzz', [2, 3, 4, 5, 11])
print test(Foo,'def', [2, 3, 4, 5, 11])
print test(Foo,'abc', [2, 3, 4, 5, 11])
Вы можете заменить имя tuple
на list
если это действительно необходимо, но кортеж - это более легкая структура данных
Edit
Принимая во внимание замечание gddc в комментарии, я заменил список lifoos со словарем dicfoos : последний избегает поиска, когда нужны экземпляры с точным именем, itel с этим точным именем дает список таких экземпляров