Python 3:什么时候使用dict,当元组列表?

时间:2013-01-20 11:33:37

标签: python list dictionary python-3.x tuples

例如,我有id个监狱囚犯。每个囚犯都有一个名字。

我知道dictionarys是如何工作的,我知道元组是如何工作的,我知道列表是如何工作的,但有时我会看到使用的字典,有时还会列出元组列表。在我的案例中我应该使用哪一个?

d = {
    1: "Mike",
    2: "Bob",
    3: "Tom"
}

VS

l = [
    (1, "Mike"),
    (2, "Bob"),
    (3, "Tom")
]

并概括了这个问题:我应该何时使用dict,何时使用元组列表,哪一个有什么好处?

3 个答案:

答案 0 :(得分:7)

如果按顺序存储项目,则应使用列表。在这种情况下,唯一重要的是ID被映射到名称。

字典是一种映射,这意味着键和值之间的关系不对称。例如,通过已知值获取密钥是棘手的(并且在一般情况下并不总是可行),而通过任何项的值过滤元组的列表(或者一组,如此)也同样容易。

话虽如此,在选择数据结构时,考虑如何从中检索数据是有意义的。如果您可以将idname视为类似C struct的相同部分(例如,您需要通过其中任何一个进行搜索等),那么您最好使用元组或collections.namedtuple。您仍然可以将它们放在列表或集合中,具体取决于您是否需要保留它。

但是如果id是一个“特殊”字段,用于检索有关该对象的其余信息,并且它保证是唯一的(好吧,“ID”表示它),并且你不要需要内部订单,你想要恒定的时间随机访问 - 当然使用dict。

答案 1 :(得分:5)

它们之间有两个主要区别:

  • 字典是无序的,元组列表是。因此,如果订购很重要,请使用后者。

  • 将键映射到值需要在dict中保持恒定时间,在元组列表中执行相同操作需要线性时间。因此,键值对的数量越大,扫描元组列表以查找匹配所需的时间就越多,而在字典中,查找几乎是即时的。

    (如果您的元组保持排序顺序,您可以使用二进制搜索将搜索时间减少到O(log n);但这仍然比字典的常量时间慢。

在大多数情况下,您使用dict。即使需要订购,您也可以使用collections.OrderedDict来充分利用这两个世界。

答案 2 :(得分:2)

在你的情况下,我会使用字典。您可能需要考虑使用一个原因。

  • 字典允许使用其API来操作键和 其中的值,需要更多代码的东西 元组列表。

例如,考虑一下:

要使用字典获取囚犯的姓名,您只需执行以下操作:

d.values()

要对元组列表执行相同的操作,您需要执行此操作:

names = []
for tup in l:
    names.append(tup[1])
  • 字典值是可变的,这意味着可以更改它们。 你不能用元组做同样的事情(它是不可变的)。

E.g

d[1] = 'Fotis'

要使用元组列表实现相同的功能,您必须使用新元组替换要操作的元组。

E.g

l[1] = (2, 'Max')