Dictionaries 与他们的名字相似 - 一本字典 . 在字典中,您有一个'index'个单词,并且每个单词都有一个定义 . 在python中,该单词称为'key',定义为'value' . 字典中的值不是't numbered - tare similar to what their name suggests - a dictionary. In a dictionary, you have an ' index ' of words, and for each of them a definition. In python, the word is called a ' key ', and the definition a ' value '. The values in a dictionary aren' t编号 - 它们也没有任何特定的顺序 - 键也做同样的事情 . 您可以添加,删除和修改词典中的值 . 示例:电话簿 .
list 保持秩序, dict 和 set 不:当您关心订单时,您必须使用 list (如果您选择的容器仅限于这三个,当然;-) .
dict 与每个键关联一个值,而 list 和 set 只包含值:显然是非常不同的用例 .
set 要求物品可以清洗, list 不要:如果您有不可清洗物品,则不能使用 set 而必须使用 list .
set 禁止重复, list 不:也是一个至关重要的区别 . ("multiset",将重复项映射到不止一次出现的项目的不同计数,可以在 collections.Counter 中找到 - 你可以 Build 一个 dict ,如果由于一些奇怪的原因你无法导入 collections ,或者,在预先2.7 Python作为 collections.defaultdict(int) ,使用项目作为键,关联值作为计数) .
检查 set (或 dict ,用于键)中的值的成员资格是非常快的(花费大约一个恒定的短时间),而在列表中,它需要时间与列表成比例's length in the average and worst cases. So, if you have hashable items, don' t关心顺序或重复,并希望快速的会员资格检查, set 优于 list .
9 回答
如果有一组映射到值的唯一键,请使用字典 .
如果您有一个有序的项目集合,请使用列表 .
使用集合存储无序的项目集 .
如果需要无序的唯一元素集合,请使用
set
. (例如,当您需要文档中使用的所有单词的集合时) .如果要收集不可变的有序元素列表,请使用
tuple
. (例如,当你想要一个(name,phone_number)对想要用作集合中的元素时,你需要一个元组而不是一个列表,因为集合要求元素是不可变的) .如果要收集可变的有序元素列表,请使用
list
. (例如,当您要将新电话号码附加到列表时:[number1,number2,...]) .如果需要从键到值的映射,请使用
dict
. (例如,当您需要将姓名映射到电话号码的电话簿时:{'John Smith' : '555-1212'}
) . 注意dict中的键是无序的 . (如果您遍历dict(电话簿),则键(名称)可能以任何顺序显示) .结合列表,dicts和集合,还有另一个有趣的python对象,OrderedDicts .
当您需要保留键的顺序时,OrderedDicts可能很有用,例如使用文档:通常需要文档中所有术语的向量表示 . 因此,使用OrderedDicts,您可以有效地验证术语是否已被读过,添加术语,提取术语,并且在所有操作之后,您可以提取它们的有序矢量表示 .
对于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
当然是内置的对于任何人,如果您能改进这个答案并在各个方面提供更好的图表,我将不胜感激 . 随意欢迎 .
PS:图表是用yed制作的 . graphml文件is here
Lists 是他们看起来的 - 一系列 Value 观 . 它们中的每一个都从0开始编号 - 第一个编号为零,第二个编号为1,第三个编号为2,等等 . 您可以从列表中删除值,并在末尾添加新值 . 示例:您的许多猫的名字 .
Tuples 就像列表一样,但你无法改变它们的值 . 您首先给出的值是您为该程序的其余部分所坚持的值 . 同样,每个值从零开始编号,以便于参考 . 示例:一年中的月份名称 .
Dictionaries 与他们的名字相似 - 一本字典 . 在字典中,您有一个'index'个单词,并且每个单词都有一个定义 . 在python中,该单词称为'key',定义为'value' . 字典中的值不是't numbered - tare similar to what their name suggests - a dictionary. In a dictionary, you have an ' index ' of words, and for each of them a definition. In python, the word is called a ' key ', and the definition a ' value '. The values in a dictionary aren' t编号 - 它们也没有任何特定的顺序 - 键也做同样的事情 . 您可以添加,删除和修改词典中的值 . 示例:电话簿 .
你只需要有序的物品序列吗?去列表 .
您是否只需要知道您是否已经获得特定值,但是没有订购(并且您不需要存储重复项)?使用一套 .
您是否需要将值与键关联,以便以后可以有效地(通过键)查找它们?使用字典 .
虽然这不包括
set
,但它是dict
和list
的一个很好的解释:http://www.sthurlow.com/python/lesson06/
list
保持秩序,dict
和set
不:当您关心订单时,您必须使用list
(如果您选择的容器仅限于这三个,当然;-) .dict
与每个键关联一个值,而list
和set
只包含值:显然是非常不同的用例 .set
要求物品可以清洗,list
不要:如果您有不可清洗物品,则不能使用set
而必须使用list
.set
禁止重复,list
不:也是一个至关重要的区别 . ("multiset",将重复项映射到不止一次出现的项目的不同计数,可以在collections.Counter
中找到 - 你可以 Build 一个dict
,如果由于一些奇怪的原因你无法导入collections
,或者,在预先2.7 Python作为collections.defaultdict(int)
,使用项目作为键,关联值作为计数) .检查
set
(或dict
,用于键)中的值的成员资格是非常快的(花费大约一个恒定的短时间),而在列表中,它需要时间与列表成比例's length in the average and worst cases. So, if you have hashable items, don' t关心顺序或重复,并希望快速的会员资格检查,set
优于list
.使用它们时,我会制作一份详尽的方法备忘单供您参考: