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

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


当前回答

与列表、字典和集合相结合,还有另一个有趣的python对象OrderedDicts。

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

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

其他回答

在使用它们的时候,我为它们的方法做了一个详尽的备忘单,供你参考:

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

对于c++,我总是在脑海中有这样的流程图:在哪个场景中使用特定的STL容器?,所以我很好奇Python3中是否也有类似的东西,但我运气不好。

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

此外,我发现没有好办法将以下数据结构合并到图表中:字节、字节数组、元组、named_tuples、ChainMap、计数器和数组。

OrderedDict和deque可以通过collections模块获得。 Heapq可以从Heapq模块获得 LifoQueue、Queue和PriorityQueue可以通过Queue模块使用,Queue模块是为并发(线程)访问而设计的。(还有一个多处理。队列可用,但我不知道与队列的区别。队列,但假定它应该在需要从进程进行并发访问时使用。) Dict, set, frozen_set和list当然是内置的

对于任何人,如果你能改进这个答案,并在每个方面提供一个更好的图表,我将非常感激。请随意,欢迎光临。

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

虽然这里不包括集合,但它很好地解释了字典和列表:

Lists are what they seem - a list of values. Each one of them is numbered, starting from zero - the first one is numbered zero, the second 1, the third 2, etc. You can remove values from the list, and add new values to the end. Example: Your many cats' names. Dictionaries are 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 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. The values in a dictionary aren't numbered - they aren't in any specific order, either - the key does the same thing. You can add, remove, and modify the values in dictionaries. Example: telephone book.

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

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

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

Dictionaries are 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 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 numbered - they aren't in any specific order, either - the key does the same thing. You can add, remove, and modify the values in dictionaries. Example: telephone book.

list保持顺序,dict和set则不然:因此,当您关心顺序时,必须使用list(当然,如果您选择的容器仅限于这三种;-))。

Dict将每个键与值关联,而list和set只包含值:显然,这是非常不同的用例。

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

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

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