在Python中,何时使用字典,列表或集?

什么时候应该使用字典、列表或集合?

是否存在更适合每种数据类型的场景?

215455 次浏览
  • 你只是需要一个有序的项目序列吗?列个清单。
  • 你是否只需要知道你是否已经得到了了一个特定的值,但没有排序(并且你不需要存储副本)?使用一个集合。
  • 您是否需要将值与键相关联,以便稍后可以有效地(按键)查找它们?使用字典。

当你想要唯一元素的无序集合时,使用set。(例如,当您需要文档中使用的所有单词的集合时)。

当你想收集一个不可变的有序元素列表时,使用tuple。(例如,当您希望将(name, phone_number)对用作集合中的元素时,您将需要元组而不是列表,因为集合要求元素是不可变的)。

当你想收集一个可变的有序元素列表时,使用list。(例如,当您想要将新的电话号码追加到列表:[number1, number2,…])。

当你想要从键映射到值时,使用dict。(例如,当你想要一个将名字映射到电话号码的电话簿:{'John Smith' : '555-1212'})。注意字典中的键是无序的。(如果你遍历字典(电话簿),键(名字)可能以任何顺序出现)。

  • 当您有一组映射到值的唯一键时,请使用字典。

  • 如果你有一个有序的项目集合,可以使用列表。

  • 使用集合存储一组无序的项。

list保持顺序,而dictset不能:因此,当你关心顺序时,你必须使用list(当然,如果你选择的容器仅限于这三个;-))。

dict将每个键与一个值关联,而listset只包含值:显然是非常不同的用例。

set要求项是可哈希的,而list不要求:因此,如果你有不可哈希的项,你不能使用set,而必须使用list

set禁止重复,而list不允许:这也是一个重要的区别。(“multiset”可以在collections.Counter中找到,它将重复项映射到出现多次的不同计数中——如果由于某种奇怪的原因无法导入collections,则可以将其构建为dict,或者在2.7之前的Python中作为collections.defaultdict(int),使用项作为键,并将相关值作为计数)。

set(或dict,用于键)中检查值的成员关系非常快(大约需要一个常数,很短的时间),而在列表中,在平均和最坏的情况下,它需要与列表长度成比例的时间。因此,如果你有可哈希的项,不关心顺序或重复,并且想要快速的成员检查,setlist更好。

虽然这并不包括__abc0,但它很好地解释了__abc1和__abc2:

列表就是它们看起来的那样——一个值的列表。每一个都是 编号,从0开始-第一个编号为0 第二个1,第三个2,等等。可以从列表中删除值和 最后添加新值。例如:你的许多猫的名字。

字典就像它的名字所暗示的那样——字典。 在字典中,你有一个单词的“索引”,每个单词都有一个索引 定义。在python中,这个词被称为“key”,其定义 “价值”。字典中的值是没有编号的——只是相似而已 正如他们的名字所暗示的,一本字典。在字典里,你有 一个单词的索引,每个单词都有一个定义。中的值 字典是没有编号的——它们没有任何特定的顺序, 或者-键做同样的事情。您可以添加、删除和修改 字典中的值。例如:电话簿

.

.

http://www.sthurlow.com/python/lesson06/

列表就是它们看起来的那样——一个值列表。每一个都有编号,从0开始——第一个编号为0,第二个编号为1,第三个编号为2,以此类推。您可以从列表中删除值,并在末尾添加新值。例子:你的许多猫的名字。

元组就像列表一样,但是你不能改变它们的值。你首先给出的值,就是你在接下来的程序中一直用到的值。同样,每个值都从0开始编号,以便于参考。例如:一年中月份的名称。

字典类似于他们的名字所暗示的-一个字典。在字典中,你有一个单词的索引,每个单词都有一个定义。在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对象,OrderedDicts

有序字典就像普通字典一样,但是它们会记住条目插入的顺序。在有序字典上迭代时,项将按照键第一次添加的顺序返回。

当你需要保存键的顺序时,OrderedDicts可能很有用,例如处理文档:通常需要文档中所有术语的向量表示。因此,使用OrderedDicts,你可以有效地验证一个项之前是否读过,添加项,提取项,在所有操作之后,你可以提取它们的有序向量表示。

对于c++,我一直在脑海中有这个流程图:在哪种情况下我使用特定的STL容器?,所以我很好奇Python3中是否也有类似的东西,但我没有运气。

对于Python,你需要记住的是:Python没有像c++那样单一的标准。因此,不同的Python解释器(例如CPython, PyPy)可能存在巨大的差异。下面是CPython的流程图。

此外,我发现没有好办法将以下数据结构合并到图表中:bytesbyte arraystuplesnamed_tuplesChainMapCounterarrays

  • OrderedDictdeque可通过collections模块使用。
  • heapq可以从heapq模块获得
  • LifoQueueQueuePriorityQueue可以通过queue模块获得,该模块是为并发(线程)访问而设计的。(还有一个multiprocessing.Queue可用,但我不知道与queue.Queue的区别,但我会假设它应该在需要从进程进行并发访问时使用。)
  • dictsetfrozen_setlist当然是内置的
对于任何人,如果你能改进这个答案,并在每个方面提供一个更好的图表,我会很感激。请随意,欢迎光临。 流程图 < / p >

PS:图是用yed做的。graphml文件在这里

简而言之,使用:

list -如果你需要一个有序的项目序列。

dict -如果你需要将值与键关联

set -如果你需要保留唯一的元素。

详细解释

List . bref ="https://docs.python.org/3/library/stdtypes.html?highlight=list#lists

列表是一个可变序列,通常用于存储同构项的集合。

列表实现了所有常见的序列操作:

  • x in lx not in l
  • __abc0, __abc1, __abc2
  • __abc0, __abc1, __abc2
  • l.count(x)
  • l.index(x[, i[, j]]) - lx第一次出现的索引(在i索引处或之后和j索引之前)

list还实现了所有可变序列操作:

  • l[i] = x - l中的i项被x替换
  • l[i:j] = t——lij的切片被可迭代对象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 -用重复n次的内容更新l
  • l.insert(i, x) -在i给出的索引处将x插入到l
  • l.pop([i]) -检索i处的项,并从l中删除它
  • l.remove(x) -从l中删除第一项,其中l[i]等于x
  • l.reverse() -将l中的项颠倒

通过使用appendpop方法,可以将列表用作堆栈。

字典

字典将可哈希值映射到任意对象。字典是一个可变对象。字典的主要操作是存储带有某个键的值,并在给定键的情况下提取值。

在字典中,不能使用不可哈希的值作为键,即包含列表、字典或其他可变类型的值。

Set

set是不同哈希对象的无序集合。集合通常用于包括成员测试,从序列中删除重复项,以及计算数学操作,如交集、并集、差分和对称差分。

字典:python字典就像一个哈希表,以键作为索引,对象作为值。

列表:列表用于保存数组中的对象,并根据该对象在数组中的位置进行索引。

Set: Set是一个带有函数的集合,这些函数可以判断一个对象是否存在于集合中。

就OP问的问题而言,可能跑题了-

  1. List:有序、可变对象的不可分解集合。
  2. 元组:有序、不可变对象的可哈希集合,如 李列表。< / >
  3. 集合:一个不可哈希的无序、可变和独立的集合 李对象。< / >
  4. Frozenset:无序的,不可变的和的可哈希集合 李的对象。< / > 字典:可变对象的不可哈希的无序集合 将可哈希值映射为任意值

要从视觉上比较它们,一目了然,请看图-

比较图像 .

字典:当你想用索引以外的东西来查找某个东西时。例子:

dictionary_of_transport = {
"cars": 8,
"boats": 2,
"planes": 0
}
print("I have the following amount of planes:")
print(dictionary_of_transport["planes"])
#Output: 0

列表和集:当您想要添加和删除值时。< br > 列表:使用索引
查找值

. set:存储值,但不能使用任何方式访问它们