ChatGPT解决这个技术问题 Extra ChatGPT

在 Python 中,何时使用 Dictionary、List 或 Set?

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

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


J
Josh Correia

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

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

set 要求项目是可散列的,list 不要求:如果您有不可散列的项目,则不能使用 set,而必须使用 list

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

检查 set(或 dict,对于键)中的值的成员资格非常快(大约需要一个恒定的短时间),而在一个列表中,它所花费的时间与列表的平均长度成正比,最差案例。因此,如果您有可散列的项目,不关心顺序或重复,并且想要快速的成员资格检查,setlist 更好。


请注意,Python 3.7 默认已订购 dict
J
Jon Skeet

您只需要有序的项目序列吗?去找一份清单。

您是否只需要知道您是否已经获得了特定的价值,但没有订购(并且您不需要存储重复项)?使用一套。

您是否需要将值与键关联,以便以后可以有效地(通过键)查找它们?使用字典。


这应该是 Alex M. 上述答案的“TL;DR”部分。:-)
我认为情况正好相反。亚历克斯应该把他的选票捐给乔恩。这个答案几乎涵盖了所有内容,而且更加简洁明了。
但是,如果您想知道这些数据类型之间的时间复杂度差异 Alex 的解释效果更好
u
unutbu

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

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

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

如果您需要从键到值的映射,请使用 dict。 (例如,当您需要将姓名映射到电话号码的电话簿时:{'John Smith' : '555-1212'})。请注意 dict 中的键是无序的。 (如果您遍历 dict(电话簿),则键(名称)可能以任何顺序显示)。


呃,他没有问元组。
@habnabit 他没有。但我做到了
S
SLaks

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

如果您有有序的项目集合,请使用列表。

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


l
lmiguelvargasf

简而言之,使用:

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 的项目

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

字典

字典将可散列值映射到任意对象。字典是一个可变对象。字典上的主要操作是存储带有某个键的值并提取给定键的值。

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

集合是不同的可散列对象的无序集合。集合通常用于包括成员资格测试、从序列中删除重复项以及计算数学运算,例如交集、并集、差异和对称差异。


2
2 revs

对于 C++,我总是想到这个流程图:In which scenario do I use a particular STL container?,所以我很好奇 Python3 是否也有类似的东西,但我没有运气。

对于 Python,您需要记住的是:对于 C++,没有单一的 Python 标准。因此,不同的 Python 解释器(例如 CPython、PyPy)可能存在巨大差异。以下流程图适用于 CPython。

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

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 - 这是一个错误吗?
j
jscs

虽然这不包括 set,但它很好地解释了 dictlist

列表就是它们看起来的样子 - 一个值列表。它们中的每一个都从零开始编号 - 第一个编号为零,第二个编号为 1,第三个编号为 2,等等。您可以从列表中删除值,并在末尾添加新值。示例:您的许多猫的名字。字典类似于它们的名字所暗示的 - 字典。在字典中,你有一个单词的“索引”,每个单词都有一个定义。在 python 中,单词称为“键”,定义称为“值”。字典中的值没有编号 - 皮重类似于它们的名字所暗示的 - 字典。在字典中,你有一个单词的“索引”,每个单词都有一个定义。字典中的值没有编号——它们也没有任何特定的顺序——键做同样的事情。您可以添加、删除和修改字典中的值。例如:电话簿。

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


F
Federico Caccia

结合 listsdictssets,还有另一个有趣的 Python 对象,OrderedDicts

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

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


N
Nitish Kumar Pal

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

元组就像列表一样,但您不能更改它们的值。您首先给出的值是您在程序的其余部分中坚持的值。同样,每个值都从零开始编号,以便于参考。示例:一年中月份的名称。

字典类似于它们的名字所暗示的 - 字典。在字典中,你有一个单词的“索引”,每个单词都有一个定义。在 python 中,单词称为“键”,定义称为“值”。字典中的值没有编号 - 皮重类似于它们的名字所暗示的 - 字典。在字典中,你有一个单词的“索引”,每个单词都有一个定义。在 python 中,单词称为“键”,定义称为“值”。字典中的值没有编号——它们也没有任何特定的顺序——键做同样的事情。您可以添加、删除和修改字典中的值。例如:电话簿。


A
AbstProcDo

在使用它们时,我对它们的方法进行了详尽的备忘单供您参考:

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'}}

S
Srinivas P

字典:python 字典的使用类似于哈希表,键为索引,对象为值。

列表:列表用于保存数组中的对象,该数组由该对象在数组中的位置索引。

集合:集合是具有可以判断对象是否存在于集合中的函数的集合。


S
SIslam

就OP提出的问题而言,可能是题外话-

列表:有序、可变对象的不可散列集合。元组:有序、不可变对象的可散列集合,如列表。集合:无序、可变和不同对象的不可散列集合。 Frozenset:无序、不可变和不同对象的可散列集合。 Dictionary :一个不可散列的、无序的可变对象集合,可将可散列值映射到任意值。

为了直观地比较它们,一目了然,看图片 -

https://i.stack.imgur.com/z3m5U.png


n
norway-yv

字典:当您想使用索引以外的其他内容查找某些内容时。例子:

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:存储值,但您不能使用任何东西访问它们。