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

2025-02-14 09:49:00
admin
原创
46
摘要:问题描述:何时应使用字典、列表或集合?是否存在更适合每种数据类型的场景?解决方案 1:Alist保持秩序,dict而set不要:因此,当您关心秩序时,您必须使用list(当然,如果您的容器选择仅限于这三个;-))。dict将每个键与一个值关联起来,而list和set仅包含值:显然,用例非常不同。set要求项目...

问题描述:

何时应使用字典、列表或集合?

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


解决方案 1:

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

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

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 lx 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]])- 第一次出现的索引(在索引xl或之后i和之前j

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

  • l[i] = x- 的项目il替换为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)- 插入xl给定的索引处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_tuplesChainMapCounterarrays`

  • OrderedDict并可deque通过模块获得collections

  • heapq可从heapq模块获得

  • LifoQueueQueuePriorityQueue可通过queue专为并发(线程)访问而设计的模块使用。(还有一个multiprocessing.Queue可用的,但我不知道它们的区别queue.Queue,但我认为它应该在需要从进程进行并发访问时使用。)

  • dict当然,setfrozen_set、 和都是内置的list

对于任何人,如果您能改进这个答案并在各方面提供更好的图表,我将不胜感激。欢迎随意。
流程图

PS:该图是用 yed 制作的。graphml 文件在这里

解决方案 7:

虽然这没有涵盖sets,但它很好地解释了dicts 和lists:

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

字典类似于其名称所暗示的那样 - 一本字典。在字典中,您有一个单词的“索引”,并且每个单词都有一个定义。在 Python 中,单词称为“键”,定义称为“值”。字典中的值没有编号 - 类似于其名称所暗示的那样 - 一本字典。在字典中,您有一个单词的“索引”,并且每个单词都有一个定义。字典中的值没有编号 - 它们也没有任何特定的顺序 - 键的作用相同。您可以添加、删除和修改字典中的值。示例:电话簿。

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

解决方案 8:

列表字典集合结合,还有另一个有趣的 Python 对象,OrderedDicts。

有序字典与普通字典类似,但它们会记住项目插入的顺序。在对有序字典进行迭代时,将按照键首次添加的顺序返回项目。

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

解决方案 9:

可能与楼主提出的问题无关-

  1. 列表:有序、可变对象的不可散列集合。

  2. 元组:有序、不可变对象的可哈希集合,类似列表。

  3. 集合:无序、可变且不同的对象的不可散列集合。

  4. Frozenset:无序、不可变且不同对象的可哈希集合。

  5. 字典:一个不可散列的、无序的可变对象集合,将可散列值映射到任意值。

为了直观地进行比较,请看图:

对比图

解决方案 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

列表和集合:当您想要添加和删除值时。

列表:使用索引查找值

集合:存储值,但无法使用任何方式访问它们。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用