Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 哪种结构更像蟒蛇?_Python - Fatal编程技术网

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+中的插入顺序。这个问题越来越不清楚了。