Answers:
一个list
保持秩序,dict
而set
不要:当你关心的秩序,因此,您必须使用list
(如果你的容器的选择仅限于这三种,当然;-)。
dict
与每个键关联一个值,而list
而set
仅包含值:很明显,非常不同的用例。
set
要求项目是可哈希的,list
不是:如果您有不可哈希的项目,则不能使用,set
而必须使用list
。
set
禁止重复,list
不禁止:也是至关重要的区别。(可以在以下位置找到“多重集”,该多重集将重复项映射到不止一次存在的项目的不同计数中;如果出于某些奇怪的原因而无法导入,则collections.Counter
可以将其构建为,或者在2.7之前的版本中Python作为,使用项目作为键,并将相关值作为计数)。dict
collections
collections.defaultdict(int)
在set
(或dict
键中)中检查值的隶属关系非常快(花费一个恒定的短时间),而在列表中,它花费的时间与列表的长度成正比(在一般情况下和最坏情况下)。因此,如果您有可散列的项目,则不关心订单或重复项,而希望快速进行成员资格检查set
比更好list
。
如果您想要无序的唯一元素集合,请使用set
。(例如,当您要在文档中使用所有单词的集合时)。
当您想要收集元素的不可变的有序列表时,请使用tuple
。(例如,当您希望将(名称,phone_number)对用作集合中的元素时,您将需要一个元组而不是一个列表,因为集合要求元素是不可变的。
当您想收集元素的可变的有序列表时,请使用list
。(例如,当您要将新的电话号码追加到列表中时:[number1,number2,...])。
当您想要从键到值的映射时,请使用dict
。(例如,当您需要将姓名映射到电话号码的电话簿时:){'John Smith' : '555-1212'}
。请注意,字典中的键是无序的。(如果您遍历字典(电话簿),则按键(名称)可能以任何顺序显示)。
简而言之,使用:
list
-如果您需要订购的物品序列。
dict
-如果您需要将值与键相关联
set
-如果您需要保留唯一元素。
列表是可变序列,通常用于存储同类项目的集合。
列表实现了所有常见的序列操作:
x in l
和 x 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]])
-的第一出现的索引x
中l
(在或之后i
和之前j
的indeces)列表还实现了所有可变序列操作:
l[i] = x
-项目i
的l
被替换x
l[i:j] = t
- l
从i
to的切片j
被iterable的内容替换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)
-插入x
到l
由下式给出的指数在i
l.pop([i])
-在处检索项目,i
并将其从中删除l
l.remove(x)
-从等于x的l
位置删除第一项l[i]
l.reverse()
-反转l
到位的项目利用方法append
和可以将列表用作堆栈pop
。
字典将可散列的值映射到任意对象。字典是可变对象。字典的主要操作是使用一些键存储值并提取给定键的值。
在字典中,不能将不可哈希的值(即包含列表,字典或其他可变类型的值)用作键。
集合是不同的可哈希对象的无序集合。集合通常用于进行成员资格测试,从序列中删除重复项以及计算数学运算(例如交集,并集,差和对称差)。
尽管这并不涵盖set
s,但这是对dict
s和list
s 的很好解释:
列表看起来就是-值列表。它们中的每一个都从零开始编号-第一个从零开始编号,第二个为1,第三个为2,依此类推。您可以从列表中删除值,并在末尾添加新值。例如:您的许多猫的名字。
字典类似于其名称所暗示的内容-字典。在字典中,您有单词的“索引”,并且每个单词都有一个定义。在python中,单词称为“键”,而定义称为“值”。字典中的值未编号-类似于其名称所建议的名称-字典。在字典中,您有单词的“索引”,并且每个单词都有一个定义。字典中的值没有编号-它们也没有任何特定的顺序-键执行相同的操作。您可以添加,删除和修改字典中的值。例如:电话簿。
对于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文件在这里
结合列表,字典和集合,还有另一个有趣的python对象OrderedDicts。
顺序词典与常规词典一样,但是它们记住项目插入的顺序。在有序字典上进行迭代时,将按照项的键首次添加的顺序返回项。
当您需要保留键的顺序(例如处理文档)时,OrderedDicts可能会很有用:通常需要文档中所有术语的向量表示。因此,使用OrderedDicts,您可以有效地验证术语是否已被阅读过,添加术语,提取术语,以及在所有操作之后可以提取它们的有序矢量表示。
列表就是它们的外观-值列表。它们中的每一个都从零开始编号-第一个从零开始编号,第二个为1,第三个为2,依此类推。您可以从列表中删除值,并在末尾添加新值。例如:您的许多猫的名字。
元组就像列表一样,但是您不能更改它们的值。首先给出的值是程序其余部分所保持的值。同样,每个值都从零开始编号,以方便参考。示例:一年中的月份名称。
字典类似于其名称所暗示的内容-字典。在字典中,您有单词的“索引”,并且每个单词都有一个定义。在python中,单词称为“键”,而定义称为“值”。字典中的值未编号-类似于其名称所建议的名称-字典。在字典中,您有单词的“索引”,并且每个单词都有一个定义。在python中,单词称为“键”,而定义称为“值”。字典中的值没有编号-它们也没有任何特定的顺序-键执行相同的操作。您可以添加,删除和修改字典中的值。例如:电话簿。
在使用它们时,我会详尽列出它们的方法,以供您参考:
class ContainerMethods:
def __init__(self):
self.list_methods_11 = {
'Add':{'append','extend','insert'},
'Subtract':{'pop','remove'},
'Sort':{'reverse', 'sort'},
'Search':{'count', 'index'},
'Entire':{'clear','copy'},
}
self.tuple_methods_2 = {'Search':'count','index'}
self.dict_methods_11 = {
'Views':{'keys', 'values', 'items'},
'Add':{'update'},
'Subtract':{'pop', 'popitem',},
'Extract':{'get','setdefault',},
'Entire':{ 'clear', 'copy','fromkeys'},
}
self.set_methods_17 ={
'Add':{['add', 'update'],['difference_update','symmetric_difference_update','intersection_update']},
'Subtract':{'pop', 'remove','discard'},
'Relation':{'isdisjoint', 'issubset', 'issuperset'},
'operation':{'union' 'intersection','difference', 'symmetric_difference'}
'Entire':{'clear', 'copy'}}