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 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
in 的索引l
(在indeces处或之后i
和之前j
)列表还实现了所有可变序列操作:
l[i] = x
-项目i
的l
被替换x
l[i:j] = t
- l
from i
to 的切片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)
-插入x
到l
由下式给出的指数在i
l.pop([i])
- 检索该项目i
并将其从l
l.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 文件在这里
虽然这不包括set
s,但它是dict
s和list
s的一个很好的解释:
列表就是他们看起来的 - 一系列价值观.它们中的每一个都是编号的,从零开始 - 第一个编号为零,第二个编号为1,第三个编号为2,等等.您可以从列表中删除值,并在末尾添加新值.示例:您的许多猫的名字.
字典与他们的名字相似 - 字典.在字典中,您有一个单词的"索引",并且每个单词都有一个定义.在python中,单词称为"键",定义称为"值".字典中的值没有编号 - 与其名称相似 - 字典.在字典中,您有一个单词的"索引",并且每个单词都有一个定义.字典中的值没有编号 - 它们也没有任何特定的顺序 - 键也做同样的事情.您可以添加,删除和修改词典中的值.示例:电话簿.
http://www.sthurlow.com/python/lesson06/