我使用SQL查询并将一连串的三元组接收到名为'results'的变量中。
三胞胎中的信息是:
*哈希电子邮件(长字符串)
*列表ID(整数)
*列表类型(单个字符,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是列表ID,c是列表类型。
*一封电子邮件可以在多个列表中找到
*列表类型只能是这两个(A或P)之一
给定变量“结果”,我想以一种高效的方式来安排这些数据,使我具有以下三元组:
[列表ID,列表类型,[电子邮件列表]]
答案 0 :(得分:1)
在注释中的其他信息之后,我建议更改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]
)来编写上面的代码