在Python中何时使用字典、列表或集合?
我什么时候应该使用字典、列表或集合呢?
有没有什么情况更适合使用这些不同的数据类型呢?
13 个回答
当你想要一个不重复的元素集合时,可以使用 set
。比如说,当你想要一个文档中所有单词的集合时,就可以用这个。
当你想要一个不可改变的有序元素列表时,可以使用 tuple
。比如说,当你想要一个(名字,电话号码)的组合,并且希望把它作为一个元素放到集合里时,就需要用元组,而不是列表,因为集合里的元素必须是不可改变的。
当你想要一个可以改变的有序元素列表时,可以使用 list
。比如说,当你想要在一个列表中添加新的电话号码时,就可以用这个列表:[号码1,号码2,...]。
当你想要一个从键到值的映射时,可以使用 dict
。比如说,当你想要一个电话本,把名字和电话号码对应起来时,可以用这个:{'John Smith' : '555-1212'}
。注意,字典里的键是没有顺序的。如果你遍历一个字典(电话本),键(名字)可能会以任何顺序出现。
你是不是只需要一串有顺序的东西?那就用列表吧。
你是不是只想知道某个特定的值有没有存在,但不需要排序(而且不需要存重复的值)?那就用集合。
你是不是需要把值和键关联起来,这样以后可以通过键快速查找?那就用字典。
一个 list
是有顺序的,而 dict
和 set
是没有顺序的:当你需要保持顺序时,就必须使用 list
(当然,这里假设你只在这三种容器中选择)。
dict
是把每个键和一个值关联起来,而 list
和 set
只是包含值:这三者的用途显然是很不同的。
set
里的项目必须是可哈希的,而 list
则不需要:所以如果你有一些不可哈希的项目,就不能使用 set
,而必须使用 list
。
set
不允许有重复的值,而 list
则可以:这也是一个重要的区别。(“多重集合”可以在 collections.Counter
中找到,它会把重复的项目计入不同的数量。如果因为某种奇怪的原因你不能导入 collections
,你也可以用 dict
来构建一个,或者在 Python 2.7 之前用 collections.defaultdict(int)
,把项目作为键,数量作为值)。
在 set
中检查一个值是否存在(或者在 dict
中检查键)是非常快的(大约是一个固定的、很短的时间),而在 list
中则需要的时间与列表的长度成正比,尤其是在平均和最坏的情况下。所以,如果你有可哈希的项目,对顺序和重复不在意,并且想要快速检查是否存在,set
比 list
更好。