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

在python中存储三元组的有效方法,python,list,loops,dictionary,data-structures,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 978a0eef

我使用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)中的一种

给定变量'result',我希望以一种有效的方式排列此数据,其中我有三个变量:

[列表id,列表类型,[电子邮件列表]]

在注释中的附加信息之后,我建议更改SQL查询,以便按照列表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\u 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]

这取决于您以后将如何处理或使用这些数据。如果有一条信息是最重要的,那么存储数据最有效的方法就是使用字典。否则,您已经有了一个“三元组列表”(
results
)我稍后的目标是迭代数据,一次迭代一个列表id。执行简单的if-else检查每个列表id的类型,然后在电子邮件上迭代。列表id在所有条目中是否唯一?请记住,将SQL查询更改为包含group by子句可能比在Python中进行后处理更有效。我们需要有关数据的更多信息以及以后如何使用数据的更多信息,以便能够为您提供有用的答案。列表id可以是下一个模板的一部分,其中包含不同的电子邮件,但类型肯定相同