【问题标题】:efficient way to store triplets in python在 python 中存储三元组的有效方法
【发布时间】:2018-12-25 13:55:54
【问题描述】:

我使用 SQL 查询并将一长串三元组接收到名为“结果”的变量中。
三元组中的信息是:
* 散列电子邮件(长字符串)
* 列表 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,列表类型,[电子邮件列表]]

【问题讨论】:

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

标签: python list loops dictionary data-structures


【解决方案1】:

在 cmets 中的附加信息之后,我建议更改 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]

【讨论】:

    猜你喜欢
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 2013-03-22
    相关资源
    最近更新 更多