5

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

我知道字典是如何工作的,我知道元组是如何工作的,我知道列表是如何工作的,但有时我会看到正在使用的字典,有时是元组列表。在我的情况下我应该使用哪一个?

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

对比

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

概括一下这个问题:什么时候应该使用字典,什么时候应该使用元组列表,一个有什么好处?

4

3 回答 3

8

当按顺序存储项目有意义时,您应该使用列表。在这种情况下,只有将 ID 映射到名称很重要。

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

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

但是 ifid是一个“特殊”字段,用于检索有关对象的其余信息,并且保证是唯一的(嗯,“ID”是指它),并且您不需要内部订单,并且您想要恒定时间随机访问——当然使用字典。

于 2013-01-20T11:38:50.380 回答
5

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

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

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

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

在大多数情况下,您使用dict. 即使需要订购,您也可以使用 acollections.OrderedDict来获得两全其美的效果。

于 2013-01-20T11:37:22.147 回答
2

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

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

例如,考虑一下:

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

d.values()

要对元组列表做同样的事情,你需要这样做:

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

例如

d[1] = 'Fotis'

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

例如

l[1] = (2, 'Max')
于 2013-01-20T11:35:21.597 回答