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