繁体   English   中英

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

[英]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被映射到名称。

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

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

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

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

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

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

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

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

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

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

例如,考虑一下:

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM