После дополнительной информации в комментариях я бы предложил изменить SQL-запрос таким образом, чтобы results
сортировался по list_id и типу, а затем:
from itertools import groupby
# assume results contains the results of the SQL query and is ordered by list_id AND type
results = [('978a0eefffeb11b0890afe7066154806', 11504, 'A'),
('c445fb5c367a18f406f96847e02ff825', 11508, 'P'),
('c445fb5c367a18f406f96847e02ff826', 11508, 'P'),
('978a0eefffeb11b0890afe7066154806', 11530, 'A'),
('c445fb5c367a18f406f96847e02ff825', 11541, 'P')]
output = {}
for (list_id, list_type), list_id_data in groupby(results, key=lambda data: (data[1], data[2])):
output[list_id, list_type] = [row[0] for row in list_id_data]
print(output)
# {(11504, 'A'): ['978a0eefffeb11b0890afe7066154806'],
# (11508, 'P'): ['c445fb5c367a18f406f96847e02ff825', 'c445fb5c367a18f406f96847e02ff826'],
# (11530, 'A'): ['978a0eefffeb11b0890afe7066154806'],
# (11541, 'P'): ['c445fb5c367a18f406f96847e02ff825']}
output
- это словарь, ключи которого(list_id, type)
кортежи и значения - это списки адресов электронной почты.
Если вам хочется испортить чей-то рабочий день, вышеприведенный цикл можно записать как понимание:
output = {(list_id, list_type): [row[0] for row in list_id_data]
for (list_id, list_type), list_id_data in groupby(results, key=lambda data: (data[1], data[2]))}
Не знаю знаю, как вы запрашиваете базу данных.Если вы используете DAL, который позволяет получать каждую строку в виде словаря, а не кортежа, то вышеприведенное можно записать в менее запутанном виде (используя имена вместо индексов, например data[1], data[2], row[0]
)