Проблема здесь в том, что вы используете неправильную структуру данных для хранения данных. Вы должны хранить их в словаре Python. Всякий раз, когда у вас есть поиск на основе элементов, используйте словарь Python.
То есть вместо списка l2 используйте
l2 = {item: A(item, "status_{}".format(item)) for item in ("1231", "13113")}
(в качестве примера я использую только два элемента)
Теперь у вас есть предмет: пара экземпляров
{'1231': <__main__.A object at 0x10a8b6470>, '13113': <__main__.A object at 0x10a8b65c0>}
после этого l3 будет только один цикл.
>>> l1 = [
... {"name":"name_1", "id":"1231"},
... {"name":"name_10000", "id":"13113"}
... ]
>>> l3 = [{**i, "status": l2.get(i["id"]).status} for i in l1]
>>> l3
[{'name': 'name_1', 'id': '1231', 'status': 'status_1231'}, {'name': 'name_10000', 'id': '13113', 'status': 'status_13113'}]
мы все еще сталкиваемся с одной проблемой. Что если у l2 нет этого идентификатора? для этого мы можем создать фиктивный класс со статусом, который возвращает None
>>> class Dummy:
... def __init__(self):
... self.status = None
...
>>> l1 = [
... {"name":"name_1", "id":"12"},
... {"name":"name_10000", "id":"13113"}
... ]
>>>
>>> l2 = {item: A(item, "status_{}".format(item)) for item in ("1231", "13113")}
>>>
>>> l3 = [{**i, "status": l2.get(i["id"], Dummy()).status} for i in l1]
>>> l3
[{'name': 'name_1', 'id': '12', 'status': None}, {'name': 'name_10000', 'id': '13113', 'status': 'status_13113'}]
смотрите здесь, мы используем get
, потому что get возвращает второе значение аргумента, если первый аргумент отсутствует.
бонус.
если вы получаете данные о l2 откуда-то, то вы можете сделать один цикл, чтобы преобразовать l2 в словарь, как я показал, и затем выполнить то же самое. таким образом вы делаете только два отдельных цикла вместо вложенного цикла.
дайте мне знать, если после этого у вас возникнут проблемы.