在Python中,何时使用Dictionary,List或Set?

Bla*_*man 280 python dictionary list set data-structures

我什么时候应该使用字典,列表或设置?

是否存在更适合每种数据类型的方案?

Ale*_*lli 589

A list保持秩序,dictset不是:当您关心订单时,您必须使用list(如果您选择的容器限于这三个,当然;-).

dict联营公司与每个键的值,而listset只包含值:非常不同的使用情况,效果显着.

set要求物品可以清洗,list不要:如果您有不可清洗的物品,因此,您不能使用set,必须改为使用list.

set禁止重复,list不:也是一个至关重要的区别.("multiset",将重复项映射到不止一次出现的项目的不同计数,可以在collections.Counter- dict如果出于某种奇怪的原因你无法导入collections,或者在2.7之前的版本中可以找到一个Python作为a collections.defaultdict(int),使用项目作为键,相关值作为计数).

检查set(或者dict,对于键)中的值的成员资格非常快(占用大约一个恒定的短时间),而在列表中,在平均和最差情况下,它需要与列表长度成比例的时间.因此,如果您有可清洗的项目,不管关于订单或重复的方式,并希望快速的会员检查,set是比list.

  • 请注意,Python 3.7 默认已对 dict 进行排序 (13认同)

Jon*_*eet 163

  • 你只需要有序的物品序列吗?去寻找一个清单.
  • 您是否只需要知道您是否已经获得特定值,但是没有订购(并且您不需要存储重复项)?使用一套.
  • 您是否需要将值与键相关联,以便稍后可以有效地(通过键)查找它们?使用字典.

  • 这应该是Alex M.的上述答案的"TL; DR"部分:-) (29认同)
  • 我认为这是相反的方式.亚历克斯应该把他的选票捐给乔恩.这个答案涵盖了几乎所有内容,它更加简洁明了. (9认同)

unu*_*tbu 19

如果需要无序的独特元素集合,请使用set.(例如,当您需要文档中使用的所有单词的集合时).

如果要收集不可变的有序元素列表,请使用tuple.(例如,当你想要一个(name,phone_number)对想要用作集合中的元素时,你需要一个元组而不是一个列表,因为集合要求元素是不可变的).

如果要收集可变的有序元素列表,请使用list.(例如,当您要将新电话号码附加到列表时:[number1,number2,...]).

如果需要从键到值的映射,请使用dict.(例如,当您需要将姓名映射到电话号码的电话簿时:) {'John Smith' : '555-1212'}.请注意,dict中的键是无序的.(如果您遍历dict(电话簿),则键(名称)可以按任何顺序显示).

  • @habnabit他没有。但我做到了 (3认同)

SLa*_*aks 18

  • 如果有一组映射到值的唯一键,请使用字典.

  • 如果您有一个有序的项目集合,请使用列表.

  • 使用集合来存储无序的项目集.


lmi*_*asf 11

简而言之,使用:

list - 如果您需要有序的项目序列。

dict - 如果您需要将值与键相关联

set - 如果您需要保留独特的元素。

详细说明

列表

列表是一个可变序列,通常用于存储同类项的集合。

列表实现了所有常见的序列操作:

  • x in lx not in l
  • l[i], l[i:j],l[i:j:k]
  • len(l), min(l),max(l)
  • l.count(x)
  • l.index(x[, i[, j]])- 第一次出现xin 的索引l(在indeces处或之后i和之前j

列表还实现了所有可变序列操作:

  • l[i] = x-项目il被替换x
  • l[i:j] = t- lfrom ito 的切片j被可迭代的内容替换t
  • del l[i:j] - 与...一样 l[i:j] = []
  • l[i:j:k] = t- 的元素l[i:j:k]被替换为t
  • del l[i:j:k]-s[i:j:k]从列表中删除 的元素
  • l.append(x)- 附加x到序列的末尾
  • l.clear()- 删除所有项目l(与 del 相同l[:]
  • l.copy()- 创建l(与 相同l[:])的浅拷贝
  • l.extend(t)l += t- 扩展l内容t
  • l *= n-更新l其内容重复n
  • l.insert(i, x)-插入xl由下式给出的指数在i
  • l.pop([i])- 检索该项目i并将其从l
  • l.remove(x)- 从等于 x 的l地方删除第一项l[i]
  • l.reverse()- 反转l原位的项目

通过利用方法append和 ,可以将列表用作堆栈pop

字典

字典将可散列值映射到任意对象。字典是一个可变对象。字典上的主要操作是使用某个键存储值并提取给定键的值。

在字典中,不能使用不可散列的值作为键,即包含列表、字典或其他可变类型的值。

集合是不同的可散列对象的无序集合。集合通常用于包括成员资格测试、从序列中删除重复项以及计算交集、并集、差和对称差等数学运算。


mat*_*ath 8

对于 C++,我一直牢记这个流程图:在哪种情况下我使用特定的 STL 容器?,所以我很好奇 Python3 是否也有类似的东西,但我没有运气。

对于 Python,您需要记住的是:对于 C++,没有单一的 Python 标准。因此,不同的 Python 解释器(例如 CPython、PyPy)可能存在巨大差异。以下流程图适用于 CPython。

另外,我发现包含以下数据结构到图中,没有什么好办法:bytesbyte arraystuplesnamed_tuplesChainMapCounter,和arrays

  • OrderedDict并且deque可以通过collections模块获得。
  • heapq可从heapq模块获得
  • LifoQueueQueuePriorityQueue可通过queue专为并发(线程)访问而设计的模块获得。(还有一个multiprocessing.Queue可用的,但我不知道它们之间的区别,queue.Queue但假设在需要进程的并发访问时应该使用它。)
  • dict, set, frozen_set, 和list当然是内置的

对于任何人,如果您能改进此答案并在各个方面提供更好的图表,我将不胜感激。感到自由和欢迎。 流程图

PS:图表是用yed制作的。graphml 文件在这里


Goo*_*ose 5

虽然这不包括sets,但它是dicts和lists的一个很好的解释:

列表就是他们看起来的 - 一系列价值观.它们中的每一个都是编号的,从零开始 - 第一个编号为零,第二个编号为1,第三个编号为2,等等.您可以从列表中删除值,并在末尾添加新值.示例:您的许多猫的名字.

字典与他们的名字相似 - 字典.在字典中,您有一个单词的"索引",并且每个单词都有一个定义.在python中,单词称为"键",定义称为"值".字典中的值没有编号 - 与其名称相似 - 字典.在字典中,您有一个单词的"索引",并且每个单词都有一个定义.字典中的值没有编号 - 它们也没有任何特定的顺序 - 键也做同样的事情.您可以添加,删除和修改词典中的值.示例:电话簿.

http://www.sthurlow.com/python/lesson06/

  • 这是一个特殊的问题,大多数回答者有~500k的声誉.. (2认同)