在Python中,何时使用Dictionary,List或Set?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Python中,何时使用Dictionary,List或Set?相关的知识,希望对你有一定的参考价值。
我什么时候应该使用字典,列表或设置?
是否存在更适合每种数据类型的方案?
list
保持秩序,dict
和set
不会:当你关心订单时,你必须使用list
(如果你选择的容器当然限于这三个;-)。
dict
将每个键与一个值相关联,而list
和set
只包含值:显然是非常不同的用例。
set
要求物品是可清洗的,list
不会:如果你有不可清洗的物品,因此,你不能使用set
而必须使用list
。
set
禁止重复,list
不:也是一个至关重要的区别。 (一个“multiset”,它将重复项映射到不止一次出现的项目的不同计数,可以在collections.Counter
中找到 - 你可以建立一个作为dict
,如果由于一些奇怪的原因你不能导入collections
,或者, pre-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(电话簿),则键(名称)可以按任何顺序显示)。
虽然这不包括set
s,但它是对dict
s和list
s的一个很好的解释:
列表就是他们看起来的 - 一系列价值观。它们中的每一个都是编号的,从零开始 - 第一个编号为零,第二个编号为1,第三个编号为2,等等。您可以从列表中删除值,并在末尾添加新值。示例:您的许多猫的名字。
字典与他们的名字相似 - 字典。在字典中,您有一个单词的“索引”,并且每个单词都有一个定义。在python中,单词称为“键”,定义称为“值”。字典中的值没有编号 - 与其名称相似 - 字典。在字典中,您有一个单词的“索引”,并且每个单词都有一个定义。字典中的值没有编号 - 它们也没有任何特定的顺序 - 键也做同样的事情。您可以添加,删除和修改词典中的值。示例:电话簿。
http://www.sthurlow.com/python/lesson06/
使用它们时,我会制作一份详尽的方法备忘单供您参考:
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'}}
列表就是他们看起来的 - 一系列价值观。它们中的每一个都是编号的,从零开始 - 第一个编号为零,第二个编号为1,第三个编号为2,等等。您可以从列表中删除值,并在末尾添加新值。示例:您的许多猫的名字。
元组就像列表一样,但你无法改变它们的值。您首先给出的值是您为该程序的其余部分所遵循的值。同样,每个值从零开始编号,以便于参考。示例:一年中的月份名称。
字典与他们的名字相似 - 字典。在字典中,您有一个单词的“索引”,并且每个单词都有一个定义。在python中,单词称为“键”,定义称为“值”。字典中的值没有编号 - 与其名称相似 - 字典。在字典中,您有一个单词的“索引”,并且每个单词都有一个定义。在python中,单词称为“键”,定义称为“值”。字典中的值没有编号 - 它们也没有任何特定的顺序 - 键也做同样的事情。您可以添加,删除和修改词典中的值。示例:电话簿。
结合列表,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
的差异,但会假设它应该在需要从进程并发访问时使用。)- qazxsw poi,qazxsw poi,qazxsw poi和
dict
当然是建在当然
对于任何人,如果你能改进这个答案并在各个方面提供更好的图表,我将不胜感激。随意欢迎。 set
PS:图表是用yed制作的。 graphml文件frozen_set
以上是关于在Python中,何时使用Dictionary,List或Set?的主要内容,如果未能解决你的问题,请参考以下文章
.Net 数据结构:ArrayList、List、HashTable、Dictionary、SortedList、SortedDictionary——速度、内存以及何时使用它们? [关闭]