эффективный способ хранить тройки в Python - PullRequest
0 голосов
/ 25 декабря 2018

Я использую SQL-запрос и получаю длинный список триплетов в переменную с именем 'results'.
информация в триплетах:
* хэшированная электронная почта (длинная строка)
* идентификатор списка (целое число)
* тип списка (один символ, A или P)

. Вот пример некоторых записей:

In[2]: for a,b,c in results:
       print a
       print b
       print c
Out[2]:978a0eefffeb11b0890afe7066154806
       11530
       A
       978a0eefffeb11b0890afe7066154806
       11504
       A
       c445fb5c367a18f406f96847e02ff825
       11508
       P
       c445fb5c367a18f406f96847e02ff825
       11541
       P

, где a - это хэшированное письмо, b - идентификатор списка, а c - тип списка.


* электронное письмо может быть найдено в нескольких списках
* тип списка может быть только одним из этих двух (A или P)

Учитывая переменную «результат», я хочу эффективно расположить эти данные, где у меня есть триплеты:
[идентификатор списка, тип списка, [список адресов электронной почты]]

1 Ответ

0 голосов
/ 25 декабря 2018

После дополнительной информации в комментариях я бы предложил изменить 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])

...