首页 文章

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

提问于
浏览
250

我什么时候应该使用字典,列表或设置?

是否存在更适合每种数据类型的方案?

9 回答

  • 0
    • 如果有一组映射到值的唯一键,请使用字典 .

    • 如果您有一个有序的项目集合,请使用列表 .

    • 使用集合存储无序的项目集 .

  • 17

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

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

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

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

  • 145

    结合列表,dicts和集合,还有另一个有趣的python对象,OrderedDicts .

    有序词典就像常规词典一样,但它们记住了项目的插入顺序 . 迭代有序字典时,将按照首次添加键的顺序返回项目 .

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

  • 18

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

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

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

    • OrderedDictdeque 可通过 collections 模块获得 .

    • heapq 可从 heapq 模块获得

    • LifoQueueQueuePriorityQueue 可通过 queue 模块获得,该模块专为并发(线程)访问而设计 . (还有 multiprocessing.Queue 可用,但我不知道与 queue.Queue 的区别,但是会假设在需要来自进程的并发访问时应该使用它 . )

    • dictsetfrozen_setlist 当然是内置的

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

    PS:图表是用yed制作的 . graphml文件is here

  • 5

    Lists 是他们看起来的 - 一系列 Value 观 . 它们中的每一个都从0开始编号 - 第一个编号为零,第二个编号为1,第三个编号为2,等等 . 您可以从列表中删除值,并在末尾添加新值 . 示例:您的许多猫的名字 .

    Tuples 就像列表一样,但你无法改变它们的值 . 您首先给出的值是您为该程序的其余部分所坚持的值 . 同样,每个值从零开始编号,以便于参考 . 示例:一年中的月份名称 .

    Dictionaries 与他们的名字相似 - 一本字典 . 在字典中,您有一个'index'个单词,并且每个单词都有一个定义 . 在python中,该单词称为'key',定义为'value' . 字典中的值不是't numbered - tare similar to what their name suggests - a dictionary. In a dictionary, you have an ' index ' of words, and for each of them a definition. In python, the word is called a ' key ', and the definition a ' value '. The values in a dictionary aren' t编号 - 它们也没有任何特定的顺序 - 键也做同样的事情 . 您可以添加,删除和修改词典中的值 . 示例:电话簿 .

  • 1
    • 你只需要有序的物品序列吗?去列表 .

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

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

  • 0

    虽然这不包括 set ,但它是 dictlist 的一个很好的解释:

    列表就是他们看起来的 - 一系列 Value 观 . 它们中的每一个都是编号的,从零开始 - 第一个编号为零,第二个编号为1,第三个编号为2,等等可以从列表中删除值,并将新值添加到结尾 . 示例:您的许多猫的名字 . 字典与他们的名字相似 - 字典 . 在字典中,您有一个单词的“索引”,并且每个单词都有一个定义 . 在python中,这个词被称为'key',而定义是'value' . 字典中的值没有编号 - 与其名称相似 - 字典 . 在字典中,您有一个单词的“索引”,并且每个单词都有一个定义 . 字典中的值没有编号 - 它们也没有任何特定的顺序 - 键也做同样的事情 . 您可以添加,删除和修改词典中的值 . 示例:电话簿 .

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

  • 0

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

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

    set 要求物品可以清洗, list 不要:如果您有不可清洗物品,则不能使用 set 而必须使用 list .

    set 禁止重复, list 不:也是一个至关重要的区别 . ("multiset",将重复项映射到不止一次出现的项目的不同计数,可以在 collections.Counter 中找到 - 你可以 Build 一个 dict ,如果由于一些奇怪的原因你无法导入 collections ,或者,在预先2.7 Python作为 collections.defaultdict(int) ,使用项目作为键,关联值作为计数) .

    检查 set (或 dict ,用于键)中的值的成员资格是非常快的(花费大约一个恒定的短时间),而在列表中,它需要时间与列表成比例's length in the average and worst cases. So, if you have hashable items, don' t关心顺序或重复,并希望快速的会员资格检查, set 优于 list .

  • 542

    使用它们时,我会制作一份详尽的方法备忘单供您参考:

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

相关问题