Bla*_*man 280 python dictionary list set data-structures
我什么时候应该使用字典,列表或设置?
是否存在更适合每种数据类型的方案?
Ale*_*lli 589
A list保持秩序,dict而set不是:当您关心订单时,您必须使用list(如果您选择的容器限于这三个,当然;-).
dict联营公司与每个键的值,而list和set只包含值:非常不同的使用情况,效果显着.
set要求物品可以清洗,list不要:如果您有不可清洗的物品,因此,您不能使用set,必须改为使用list.
set禁止重复,list不:也是一个至关重要的区别.("multiset",将重复项映射到不止一次出现的项目的不同计数,可以在collections.Counter- dict如果出于某种奇怪的原因你无法导入collections,或者在2.7之前的版本中可以找到一个Python作为a collections.defaultdict(int),使用项目作为键,相关值作为计数).
检查set(或者dict,对于键)中的值的成员资格非常快(占用大约一个恒定的短时间),而在列表中,在平均和最差情况下,它需要与列表长度成比例的时间.因此,如果您有可清洗的项目,不管关于订单或重复的方式,并希望快速的会员检查,set是比list.
Jon*_*eet 163
unu*_*tbu 19
如果需要无序的独特元素集合,请使用set.(例如,当您需要文档中使用的所有单词的集合时).
如果要收集不可变的有序元素列表,请使用tuple.(例如,当你想要一个(name,phone_number)对想要用作集合中的元素时,你需要一个元组而不是一个列表,因为集合要求元素是不可变的).
如果要收集可变的有序元素列表,请使用list.(例如,当您要将新电话号码附加到列表时:[number1,number2,...]).
如果需要从键到值的映射,请使用dict.(例如,当您需要将姓名映射到电话号码的电话簿时:) {'John Smith' : '555-1212'}.请注意,dict中的键是无序的.(如果您遍历dict(电话簿),则键(名称)可以按任何顺序显示).
lmi*_*asf 11
简而言之,使用:
list - 如果您需要有序的项目序列。
dict - 如果您需要将值与键相关联
set - 如果您需要保留独特的元素。
列表是一个可变序列,通常用于存储同类项的集合。
列表实现了所有常见的序列操作:
x in l 和 x not in ll[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-项目i的l被替换xl[i:j] = t- lfrom ito 的切片j被可迭代的内容替换tdel l[i:j] - 与...一样 l[i:j] = []l[i:j:k] = t- 的元素l[i:j:k]被替换为tdel 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内容tl *= n-更新l其内容重复n次l.insert(i, x)-插入x到l由下式给出的指数在il.pop([i])- 检索该项目i并将其从ll.remove(x)- 从等于 x 的l地方删除第一项l[i]l.reverse()- 反转l原位的项目通过利用方法append和 ,可以将列表用作堆栈pop。
字典将可散列值映射到任意对象。字典是一个可变对象。字典上的主要操作是使用某个键存储值并提取给定键的值。
在字典中,不能使用不可散列的值作为键,即包含列表、字典或其他可变类型的值。
集合是不同的可散列对象的无序集合。集合通常用于包括成员资格测试、从序列中删除重复项以及计算交集、并集、差和对称差等数学运算。
对于 C++,我一直牢记这个流程图:在哪种情况下我使用特定的 STL 容器?,所以我很好奇 Python3 是否也有类似的东西,但我没有运气。
对于 Python,您需要记住的是:对于 C++,没有单一的 Python 标准。因此,不同的 Python 解释器(例如 CPython、PyPy)可能存在巨大差异。以下流程图适用于 CPython。
另外,我发现包含以下数据结构到图中,没有什么好办法:bytes,byte arrays,tuples,named_tuples,ChainMap,Counter,和arrays。
OrderedDict并且deque可以通过collections模块获得。heapq可从heapq模块获得LifoQueue、Queue和PriorityQueue可通过queue专为并发(线程)访问而设计的模块获得。(还有一个multiprocessing.Queue可用的,但我不知道它们之间的区别,queue.Queue但假设在需要进程的并发访问时应该使用它。)dict, set, frozen_set, 和list当然是内置的对于任何人,如果您能改进此答案并在各个方面提供更好的图表,我将不胜感激。感到自由和欢迎。

PS:图表是用yed制作的。graphml 文件在这里
虽然这不包括sets,但它是dicts和lists的一个很好的解释:
列表就是他们看起来的 - 一系列价值观.它们中的每一个都是编号的,从零开始 - 第一个编号为零,第二个编号为1,第三个编号为2,等等.您可以从列表中删除值,并在末尾添加新值.示例:您的许多猫的名字.
字典与他们的名字相似 - 字典.在字典中,您有一个单词的"索引",并且每个单词都有一个定义.在python中,单词称为"键",定义称为"值".字典中的值没有编号 - 与其名称相似 - 字典.在字典中,您有一个单词的"索引",并且每个单词都有一个定义.字典中的值没有编号 - 它们也没有任何特定的顺序 - 键也做同样的事情.您可以添加,删除和修改词典中的值.示例:电话簿.
http://www.sthurlow.com/python/lesson06/