我什么时候应该使用字典、列表或集合?
是否有更适合每种数据类型的场景?
list
保持秩序,dict
和 set
不保持秩序:因此,当您关心秩序时,您必须使用 list
(当然,如果您选择的容器仅限于这三个 ;-)) .
dict
将每个键与一个值相关联,而 list
和 set
只包含值:显然,用例非常不同。
set
要求项目是可散列的,list
不要求:如果您有不可散列的项目,则不能使用 set
,而必须使用 list
。
set
禁止重复,list
不:也是一个关键的区别。 (可以在 collections.Counter
中找到“multiset”,它将重复项映射到多次出现的项目的不同计数 - 如果由于某种奇怪的原因您无法导入 {,您可以将其构建为 dict
5},或者,在 2.7 之前的 Python 中作为 collections.defaultdict(int)
,使用项目作为键,关联的值作为计数)。
检查 set
(或 dict
,对于键)中的值的成员资格非常快(大约需要一个恒定的短时间),而在一个列表中,它所花费的时间与列表的平均长度成正比,最差案例。因此,如果您有可散列的项目,不关心顺序或重复,并且想要快速的成员资格检查,set
比 list
更好。
您只需要有序的项目序列吗?去找一份清单。
您是否只需要知道您是否已经获得了特定的价值,但没有订购(并且您不需要存储重复项)?使用一套。
您是否需要将值与键关联,以便以后可以有效地(通过键)查找它们?使用字典。
如果您想要一个无序的唯一元素集合,请使用 set
。 (例如,当您想要文档中使用的所有单词的集合时)。
如果要收集不可变的有序元素列表,请使用 tuple
。 (例如,当您希望将 (name, phone_number) 对用作集合中的元素时,您需要一个元组而不是列表,因为集合要求元素是不可变的)。
如果要收集可变的有序元素列表,请使用 list
。 (例如,当您想将新电话号码附加到列表时:[number1, number2, ...])。
如果您需要从键到值的映射,请使用 dict
。 (例如,当您需要将姓名映射到电话号码的电话簿时:{'John Smith' : '555-1212'}
)。请注意 dict 中的键是无序的。 (如果您遍历 dict(电话簿),则键(名称)可能以任何顺序显示)。
当您有一组映射到值的唯一键时,请使用字典。
如果您有有序的项目集合,请使用列表。
使用集合来存储一组无序的项目。
简而言之,使用:
list
- 如果您需要有序的项目序列。
dict
- 如果您需要将值与键相关联
set
- 如果您需要保留独特的元素。
详细说明
列表
列表是一个可变序列,通常用于存储同类项的集合。
列表实现了所有常见的序列操作:
x 在 l 中和 x 不在 l 中
l[i], l[i:j], l[i:j:k]
长度(升),最小(升),最大(升)
l.count(x)
l.index(x[, i[, j]]) - x 在 l 中第一次出现的索引(在 i 或之后和 j 之前)
列表还实现了所有可变序列操作:
l[i] = x - l 的第 i 项被 x 替换
l[i:j] = t - 从 i 到 j 的 l 切片被可迭代 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 - 用 t 的内容扩展 l
l *= n - 更新 l,其内容重复 n 次
l.insert(i, x) - 在 i 给定的索引处将 x 插入 l
l.pop([i]) - 检索 i 处的项目并将其从 l 中删除
l.remove(x) - 从 l[i] 等于 x 的 l 中删除第一项
l.reverse() - 反转 l 的项目
通过利用方法 append
和 pop
,可以将列表用作堆栈。
字典
字典将可散列值映射到任意对象。字典是一个可变对象。字典上的主要操作是存储带有某个键的值并提取给定键的值。
在字典中,不能将不可散列的值用作键,即包含列表、字典或其他可变类型的值。
放
集合是不同的可散列对象的无序集合。集合通常用于包括成员资格测试、从序列中删除重复项以及计算数学运算,例如交集、并集、差异和对称差异。
对于 C++,我总是想到这个流程图:In which scenario do I use a particular STL container?,所以我很好奇 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 当然是内置的
https://i.stack.imgur.com/tPKA6.png
PS:图是用yed制作的。 graphml 文件 is here
deque
,另一次导致 deque
- 这是一个错误吗?
虽然这不包括 set
,但它很好地解释了 dict
和 list
:
列表就是它们看起来的样子 - 一个值列表。它们中的每一个都从零开始编号 - 第一个编号为零,第二个编号为 1,第三个编号为 2,等等。您可以从列表中删除值,并在末尾添加新值。示例:您的许多猫的名字。字典类似于它们的名字所暗示的 - 字典。在字典中,你有一个单词的“索引”,每个单词都有一个定义。在 python 中,单词称为“键”,定义称为“值”。字典中的值没有编号 - 皮重类似于它们的名字所暗示的 - 字典。在字典中,你有一个单词的“索引”,每个单词都有一个定义。字典中的值没有编号——它们也没有任何特定的顺序——键做同样的事情。您可以添加、删除和修改字典中的值。例如:电话簿。
http://www.sthurlow.com/python/lesson06/
结合 lists、dicts 和 sets,还有另一个有趣的 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'}}
字典:python 字典的使用类似于哈希表,键为索引,对象为值。
列表:列表用于保存数组中的对象,该数组由该对象在数组中的位置索引。
集合:集合是具有可以判断对象是否存在于集合中的函数的集合。
就OP提出的问题而言,可能是题外话-
列表:有序、可变对象的不可散列集合。元组:有序、不可变对象的可散列集合,如列表。集合:无序、可变和不同对象的不可散列集合。 Frozenset:无序、不可变和不同对象的可散列集合。 Dictionary :一个不可散列的、无序的可变对象集合,可将可散列值映射到任意值。
为了直观地比较它们,一目了然,看图片 -
https://i.stack.imgur.com/z3m5U.png
字典:当您想使用索引以外的其他内容查找某些内容时。例子:
dictionary_of_transport = {
"cars": 8,
"boats": 2,
"planes": 0
}
print("I have the following amount of planes:")
print(dictionary_of_transport["planes"])
#Output: 0
列表和集合:当您想要添加和删除值时。 Lists:使用索引查找值 Sets:存储值,但您不能使用任何东西访问它们。
不定期副业成功案例分享