Как добавить значение в объект в виде пустого списка
Создается dataclass с 3 полями:
@dataclass()
class Animals:
n: int
id: int
animal: List[str] = field(default_factory=list)
Есть набор словарей:
b = [{'n': 1, 'id': 1}, {'n': 4, 'id': 2}, {'n': 1, 'id': 3}]
При создании dataclass у нас получается объект с пустым полем animal:
b = [Animals(n=1, id=1, animal=[]), Animals(n=4, id=2, animal=[]), Animals(n=1, id=3, animal=[]}]
Так же есть другой список словарей:
initial = [
{'animal': {'cats': ['шотландец', 'сфинкс', 'манчкин']}, 'id': 1},
{'animal': {'dogs': ['овчарка', 'бульдог'], 'fish': ['окунь'], 'cats': ['сфинкс', 'ориентал']},'id': 2},
{'animal': {'dogs': ['овчарка', 'корги'], 'birds': ['воробей'], 'fish': ['сельдь']}, 'id': 3}
]
С помощью следующего кода я получаю список необходимых пород:
attr = ('cats', 'dogs', 'birds')
for obj in initial:
poroda = []
for type in obj['animal']:
if type in attr:
for name in obj['animal'][type]:
poroda.append(name)
print(poroda)
Как мне в этом коде добавить каждый список в соответствующий объект, чтобы получилось следующее:
b = [Animal(n=1, id=1, animal=['шотландец', 'сфинкс', 'манчкин']), Animal(n=4, id=2, animal=['овчарка', 'бульдог', 'сфинкс', 'ориентал']), Animal(n=1, id=3, animal= ['овчарка', 'корги', 'воробей'])]
Ответы (2 шт):
Автор решения: gil9red
→ Ссылка
Как мне в этом коде добавить каждый список в соответствующий объект, чтобы получилось следующее:
...
initial = [
{'animal': {'cats': ['шотландец', 'сфинкс', 'манчкин']}, 'id': 1},
{'animal': {'dogs': ['овчарка', 'бульдог'], 'fish': ['окунь'], 'cats': ['сфинкс', 'ориентал']},'id': 2},
{'animal': {'dogs': ['овчарка', 'корги'], 'birds': ['воробей'], 'fish': ['сельдь']}, 'id': 3}
]
b = [{'n': 1, 'id': 1}, {'n': 4, 'id': 2}, {'n': 1, 'id': 3}]
id_by_n = {x['id']: x['n'] for x in b}
attr = ('cats', 'dogs', 'birds')
animals = []
for obj in initial:
poroda = []
for type in obj['animal']:
if type in attr:
for name in obj['animal'][type]:
poroda.append(name)
obj_id = obj['id']
n = id_by_n[obj_id]
animals.append(Animals(n=n, id=obj_id, animal=poroda))
print(animals)
Результат:
[Animals(n=1, id=1, animal=['шотландец', 'сфинкс', 'манчкин']), Animals(n=4, id=2, animal=['овчарка', 'бульдог', 'сфинкс', 'ориентал']), Animals(n=1, id=3, animal=['овчарка', 'корги', 'воробей'])]
Автор решения: SergFSM
→ Ссылка
Если я все верно понял, то надо что-то вроде этого:
b = [{'n': 1, 'id': 1}, {'n': 4, 'id': 2}, {'n': 1, 'id': 3}]
initial = [
{'animal': {'cats': ['шотландец', 'сфинкс', 'манчкин']}, 'id': 1},
{'animal': {'dogs': ['овчарка', 'бульдог'], 'fish': ['окунь'], 'cats': ['сфинкс', 'ориентал']},'id': 2},
{'animal': {'dogs': ['овчарка', 'корги'], 'birds': ['воробей'], 'fish': ['сельдь']}, 'id': 3}
]
attr = ('cats', 'dogs', 'birds')
for d in initial: # объединяем списки по ключу 'animal' согласно attr и добавляем ключ 'n'
d['animal'] = sum([v for k,v in d['animal'].items() if k in attr],[])
d['n'] = next(i['n'] for i in b if i['id']==d['id'])
initial
'''
[{'animal': ['шотландец', 'сфинкс', 'манчкин'], 'id': 1, 'n': 1},
{'animal': ['овчарка', 'бульдог', 'сфинкс', 'ориентал'], 'id': 2, 'n': 4},
{'animal': ['овчарка', 'корги', 'воробей'], 'id': 3, 'n': 1}]
'''
и список объектов:
animals = [Animals(**d) for d in initial]
'''
[Animals(n=1, id=1, animal=['шотландец', 'сфинкс', 'манчкин']),
Animals(n=4, id=2, animal=['овчарка', 'бульдог', 'сфинкс', 'ориентал']),
Animals(n=1, id=3, animal=['овчарка', 'корги', 'воробей'])]