哪种结构更适合Pythonic?

时间:2019-06-21 16:56:58

标签: python

我正在应用程序的一部分中收集数据,然后将其发送出去以用于另一部分。我有几千条记录,每条记录都包含一个电子邮件地址和一些表示某些首选项的有序整数。

我的第一个想法是将我的数据整理成这样的字典:

{
    "user1@domain.com": [23, 1, 5],
    "user2@domain.com": [1, 4, 8]
}

但是后来我想到了元组。我经常忽略它们,但是在Python中元组是一个不错的选择,所以我可以这样做:

[
    ("user1@domain.com", [23, 1, 5]),
    ("user2@domain.com", [1, 4, 8])
]

这些示例每个显示两个记录,但实际上我将在成千上万个记录的某个地方。

其中一个比另一个更pythonic吗?我应该考虑另一种方法吗?

我倾向于使用字典,因为在构建结构时,我会选择如下所示的有序记录:

(("user1@domain.com", 23), ("user1@domain.com", 1), ("user1@domain.com", 5), ("user2@domain.com", 1), ("user2@domain.com", 4), ("user2@domain.com", 8))

并将它们组合为上述形式之一。使用字典,可以轻松地反复引用同一用户的列表。对于元组列表,我想我需要保留对最后一个元素的引用,或者继续在列表上调用len()

2 个答案:

答案 0 :(得分:2)

这是一个观点问题,我的观点是,两者都不是更pythonic。数据的结构方式取决于计划使用的方式。

您在一条评论中提到,当您使用数据时,您将只遍历数据,因此任何一种格式都可以。但是,要使用("user1@domain.com", 23)之类的元组来构建结构,则使用dict(或DefaultDict)会更加方便:

entries = (("user1@domain.com", 23), ("user1@domain.com", 1), ("user1@domain.com", 5), ("user2@domain.com", 1), ("user2@domain.com", 4), ("user2@domain.com", 8))
result = {}
for email, number in entries:
    result.setdefault(email, []).append(number)

或者使用标准库:

import itertools
import operator
entries = (("user1@domain.com", 23), ("user1@domain.com", 1), ("user1@domain.com", 5), ("user2@domain.com", 1), ("user2@domain.com", 4), ("user2@domain.com", 8))
result = dict((k, [w[1] for w in v]) for k, v in itertools.groupby(sorted(entries), operator.itemgetter(0)))

答案 1 :(得分:1)

如果您要根据电子邮件地址搜索数据或从中检索数据,那么将电子邮件作为字典中的键将是一种更快的操作。根据您描述的数据记录,将数据添加到字典中的速度也将比元组更快。

这是因为在python中,dict are stored as hash tables使搜索键O(1)操作,而要查找元组的第一个元素,则需要遍历整个元组列表O(n)操作。

相关问题