在 Python 中,何时使用字典、列表或集合?
- 2025-02-14 09:49:00
- admin 原创
- 46
问题描述:
何时应使用字典、列表或集合?
是否存在更适合每种数据类型的场景?
解决方案 1:
Alist
保持秩序,dict
而set
不要:因此,当您关心秩序时,您必须使用list
(当然,如果您的容器选择仅限于这三个;-))。
dict
将每个键与一个值关联起来,而list
和set
仅包含值:显然,用例非常不同。
set
要求项目可散列,list
否则:如果您有不可散列的项目,则您不能使用set
而必须使用list
。
set
禁止重复,list
不禁止:也是一个关键的区别。(可以在中找到“多重集”,它将重复项映射到出现多次的项目的不同计数中——如果出于某种奇怪的原因您无法导入,collections.Counter
您可以将其构建为,或者在 2.7 之前的 Python 中将其构建为,使用项目作为键并将关联值作为计数)。dict
`collections`collections.defaultdict(int)
检查 a 中值的成员资格set
(或dict
,对于键)非常快(大约需要常数个短时间),而在列表中,在平均和最坏情况下,所需的时间与列表的长度成正比。因此,如果您有可哈希的项目,不必关心顺序或重复项,并且希望快速检查成员资格,set
则比 更好list
。
解决方案 2:
你只是需要物品的有序序列吗?那就列一个清单吧。
您是否只需要知道是否已经获得特定值,但不需要排序(并且不需要存储重复项)?使用集合。
您是否需要将值与键关联起来,以便以后可以高效地(按键)查找它们?使用字典。
解决方案 3:
当您想要一个无序的唯一元素集合时,请使用set
。 (例如,当您想要文档中使用的所有单词的集合时)。
当您想要收集一个不可变的有序元素列表时,请使用tuple
。(例如,当您想要将 (name, phone_number) 对用作集合中的元素时,您需要一个元组而不是列表,因为集合要求元素是不可变的)。
当您想要收集可变的有序元素列表时,请使用list
。 (例如,当您想将新的电话号码附加到列表时:[number1, number2, ...])。
当您需要将键映射到值时,请使用dict
。(例如,当您想要将姓名映射到电话号码的电话簿时{'John Smith' : '555-1212'}
:)。请注意,字典中的键是无序的。(如果您遍历字典(电话簿),则键(姓名)可能会以任何顺序显示)。
解决方案 4:
当您有一组映射到值的唯一键时,请使用字典。
如果您有一个有序的项目集合,请使用列表。
使用集合来存储一组无序的项目。
解决方案 5:
简而言之,使用:
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
处l
或之后i
和之前j
)
列表还实现了所有可变序列操作:
l[i] = x
- 的项目i
被l
替换为x
l[i:j] = t
`l-从
i到的切片
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)
`l- 删除等于
l[i]`x 的第一个项l.reverse()
- 将物品反转l
到位
可以利用方法append
和将列表用作堆栈pop
。
字典
字典将可哈希值映射到任意对象。字典是可变对象。字典的主要操作是使用某个键存储值并根据键提取值。
在字典中,不能使用不可哈希的值作为键,即包含列表、字典或其他可变类型的值。
放
-
集合是不同的可哈希对象的无序集合。集合通常用于包括成员资格测试、从序列中删除重复项以及计算数学运算(例如交集、并集、差集和对称差集)。
解决方案 6:
对于 C++,我始终在考虑这个流程图:在哪种情况下我应该使用特定的 STL 容器?,所以我很好奇 Python3 是否也有类似的东西,但我没有运气。
对于 Python,你需要记住的是:与 C++ 不同,Python 没有单一的标准。因此,不同的 Python 解释器(例如 CPython、PyPy)可能会有很大差异。以下流程图适用于 CPython。
此外,我发现没有好的方法将以下数据结构合并到图表中:bytes
,,,,,,和。byte arrays
`tuplesnamed_tuples
ChainMapCounter
arrays`
OrderedDict
并可deque
通过模块获得collections
。heapq
可从heapq
模块获得LifoQueue
、Queue
和PriorityQueue
可通过queue
专为并发(线程)访问而设计的模块使用。(还有一个multiprocessing.Queue
可用的,但我不知道它们的区别queue.Queue
,但我认为它应该在需要从进程进行并发访问时使用。)dict
当然,set
、frozen_set
、 和都是内置的list
对于任何人,如果您能改进这个答案并在各方面提供更好的图表,我将不胜感激。欢迎随意。
PS:该图是用 yed 制作的。graphml 文件在这里
解决方案 7:
虽然这没有涵盖set
s,但它很好地解释了dict
s 和list
s:
列表就是它们看起来的样子 - 一个值的列表。每个值都按编号排序,从零开始 - 第一个编号为零,第二个编号为 1,第三个编号为 2,等等。您可以从列表中删除值,并在末尾添加新值。示例:您的多只猫的名字。
字典类似于其名称所暗示的那样 - 一本字典。在字典中,您有一个单词的“索引”,并且每个单词都有一个定义。在 Python 中,单词称为“键”,定义称为“值”。字典中的值没有编号 - 类似于其名称所暗示的那样 - 一本字典。在字典中,您有一个单词的“索引”,并且每个单词都有一个定义。字典中的值没有编号 - 它们也没有任何特定的顺序 - 键的作用相同。您可以添加、删除和修改字典中的值。示例:电话簿。
http://www.sthurlow.com/python/lesson06/
解决方案 8:
与列表、字典和集合结合,还有另一个有趣的 Python 对象,OrderedDicts。
有序字典与普通字典类似,但它们会记住项目插入的顺序。在对有序字典进行迭代时,将按照键首次添加的顺序返回项目。
当您需要保留键的顺序时, OrderedDicts会很有用,例如处理文档:通常需要文档中所有术语的向量表示。因此,使用OrderedDicts,您可以高效地验证某个术语是否之前被读过、添加术语、提取术语,并且在完成所有操作后,您可以提取它们的有序向量表示。
解决方案 9:
可能与楼主提出的问题无关-
列表:有序、可变对象的不可散列集合。
元组:有序、不可变对象的可哈希集合,类似列表。
集合:无序、可变且不同的对象的不可散列集合。
Frozenset:无序、不可变且不同对象的可哈希集合。
字典:一个不可散列的、无序的可变对象集合,将可散列值映射到任意值。
为了直观地进行比较,请看图:
解决方案 10:
列表就是它们看起来的样子 - 一个值的列表。每个值都按编号排序,从零开始 - 第一个编号为零,第二个编号为 1,第三个编号为 2,等等。您可以从列表中删除值,并在末尾添加新值。示例:您的多只猫的名字。
元组就像列表一样,但您无法更改它们的值。您首先给出的值是程序其余部分所用的值。同样,每个值都从零开始编号,以便于参考。例如:月份名称。
字典类似于其名称所暗示的那样 - 一本字典。在字典中,您有一个单词的“索引”,并且每个单词都有一个定义。在 Python 中,单词称为“键”,定义称为“值”。字典中的值没有编号 - 类似于其名称所暗示的那样 - 一本字典。在字典中,您有一个单词的“索引”,并且每个单词都有一个定义。在 Python 中,单词称为“键”,定义称为“值”。字典中的值没有编号 - 它们也没有任何特定的顺序 - 键的作用相同。您可以添加、删除和修改字典中的值。示例:电话簿。
解决方案 11:
在使用它们时,我将其方法详尽列出,供您参考:
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'}}
解决方案 12:
字典:Python 字典的使用方式类似于哈希表,以键作为索引,以对象作为值。
列表:列表用于保存数组中的对象,并按对象在数组中的位置进行索引。
集合:集合是具有函数的集合,可以判断某个对象是否存在于集合中。
解决方案 13:
字典:当您想使用索引以外的其他方式查找某些内容时。示例:
dictionary_of_transport = {
"cars": 8,
"boats": 2,
"planes": 0
}
print("I have the following amount of planes:")
print(dictionary_of_transport["planes"])
#Output: 0
列表和集合:当您想要添加和删除值时。
列表:使用索引查找值
集合:存储值,但无法使用任何方式访问它们。