[英]Python 3: When to use dict, when list of tuples?
我有id
监狱囚犯的S,例如。 每个囚犯都有一个名字。
我知道dictionarys是如何工作的,我知道元组是如何工作的,我知道列表是如何工作的,但有时候我会看到一个字典被使用,有时候会看到一个元组列表。 在我的情况下我应该使用哪一个?
d = {
1: "Mike",
2: "Bob",
3: "Tom"
}
VS
l = [
(1, "Mike"),
(2, "Bob"),
(3, "Tom")
]
并概括了这个问题:我应该何时使用dict,何时使用元组列表,哪一个有什么好处?
在按顺序存储项目时,应使用列表。 在这种情况下,唯一重要的是ID被映射到名称。
字典是映射,这意味着键和值之间的关系不对称。 例如,通过已知值获取密钥是棘手的(并且在一般情况下并不总是可行),而通过任何项的值过滤元组的列表(或者一组)也是同样容易的。
话虽这么说,在选择数据结构时,考虑如何从中检索数据是有意义的。 如果你可以看到id
和name
是类似于C struct
的东西的相等部分(例如,你需要通过它们中的任何一个进行搜索等),那么你最好使用元组或collections.namedtuple
。 您仍然可以将它们放在列表或集合中,具体取决于您是否需要保留它。
但是如果id
是一个“特殊”字段,用于检索有关该对象的其余信息,并且它保证是唯一的(好吧,“ID”表示它),并且您不需要内部订单,而您想要恒定时间随机访问 - 当然使用dict。
它们之间有两个主要区别:
字典是无序的,元组列表是。 因此,如果订购很重要,请使用后者。
将键映射到值在dict中占用恒定时间,在元组列表中执行相同操作需要线性时间。 因此,键值对的数量越大,扫描元组列表以查找匹配所需的时间就越多,而在字典中,查找几乎是即时的。
(如果您的元组按排序顺序保存,则可以使用二进制搜索将搜索时间缩短为O(log n);但这仍然比字典的常量时间慢。
在大多数情况下,您使用dict
。 即使需要订购,您也可以使用collections.OrderedDict
来获得两全其美。
在你的情况下,我会使用字典。 您可能需要考虑使用一个原因。
例如,考虑一下:
要使用字典获取囚犯的姓名,您只需执行以下操作:
d.values()
要使用元组列表执行相同的操作,您需要执行此操作:
names = []
for tup in l:
names.append(tup[1])
例如
d[1] = 'Fotis'
要使用元组列表实现相同的功能,您必须使用新元组替换要操作的元组。
例如
l[1] = (2, 'Max')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.