Python 哪种结构更像蟒蛇?
我在应用程序的一个部分收集数据,然后将其发送到另一个部分。我有几千条记录,每一条都包含一个电子邮件地址和几个表示某些偏好的有序整数 我的第一个想法是在字典中组织数据,如下所示:Python 哪种结构更像蟒蛇?,python,Python,我在应用程序的一个部分收集数据,然后将其发送到另一个部分。我有几千条记录,每一条都包含一个电子邮件地址和几个表示某些偏好的有序整数 我的第一个想法是在字典中组织数据,如下所示: { "user1@domain.com": [23, 1, 5], "user2@domain.com": [1, 4, 8] } (("user1@domain.com", 23), ("user1@domain.com", 1), ("user1@domain.com", 5), ("user2@d
{
"user1@domain.com": [23, 1, 5],
"user2@domain.com": [1, 4, 8]
}
(("user1@domain.com", 23), ("user1@domain.com", 1), ("user1@domain.com", 5), ("user2@domain.com", 1), ("user2@domain.com", 4), ("user2@domain.com", 8))
但后来我想到了元组。我经常忽略它们,但元组在Python中是一个很好的选择,因此我可以这样做:
[
("user1@domain.com", [23, 1, 5]),
("user2@domain.com", [1, 4, 8])
]
这些示例分别显示了两条记录,但实际上我有几万条记录
其中一个比另一个更像蟒蛇吗?还有别的办法吗?
我倾向于使用字典,因为当我构建结构时,我会选择如下所示的有序记录:
{
"user1@domain.com": [23, 1, 5],
"user2@domain.com": [1, 4, 8]
}
(("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()
。如果您希望根据电子邮件地址搜索或检索数据,那么将电子邮件作为字典中的键将是一种更快的操作。将数据添加到字典中也比基于您描述的数据记录的元组更快
这是因为在python中,
dict
使搜索键O(1)
操作,而要查找元组的第一个元素,需要遍历整个元组列表,使其成为O(n)
操作 这是一个观点问题,我的观点是,两者都不太像python。数据的结构方式取决于您计划使用数据的方式
您在一篇评论中提到,当您使用数据时,您只是在数据中循环,所以任何一种格式都可以。但是,对于用元组构建结构,如(“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)))
取决于您的用例-对于某些情况,dict更好,对于其他情况,tuples/list更好。如果您没有重复的电子邮件地址(并且根据键存储的列表表明数据是聚合的),那么字典是明显的选择。这不是关于pythonic,而是关于数据检索的时间复杂性。“我经常忽略它们,但是元组在Python中是一个很好的选择”这句话有点像是一句空话(我的意思不是冒犯性的),但这到底意味着什么呢?谢谢你提到这一点。我应该澄清一下,当我使用数据时,我不会关心订单。我不会按电子邮件地址查找内容,只是循环浏览,并逐个使用每条记录。@WhiteHotLoveTiger答案实际上没有提到顺序,而且字典保留了Python 3.6+中的插入顺序。这个问题越来越不清楚了。