在python中存储三元组的有效方法

时间:2018-12-25 13:55:54

标签: python list loops dictionary data-structures

我使用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,列表类型,[电子邮件列表]]

1 个答案:

答案 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])来编写上面的代码

相关问题