元组的定义为不可变动的有序对象集合,和列表只有一个区别:不可改变。也就是说元组声明后是不能改变其内容的。python
这有意义吗?列表不是已经很好用了嘛。不,这真的颇有意义。数组
咱们回想如下Java或者PHP,在实际使用中是否是会声明大量的const
值,好比错误代码,或者描述性文字之类的直接写入代码的硬编码部分。这些内容都是一旦声明你就不但愿其它程序有意或者无心地去改写。数据结构
但这些在Python中是没法实现的,由于Python并不支持const
,而元组就是一种代替品。性能
《Head first Python》一书指出元组的性能是远优于列表的,Python解释器在这方面有针对性优化。固然这点是很容易理解的,毕竟对于一个兼顾数组和链表,功能相对复杂的容器,一个不可变的简单数据结构天然在某些性能上会赛过。但这里仍是有不少东西能够细细琢磨,好比空间复杂度列表显而易见的要高出,但在读取方面,元组的时间复杂度是真的能优于列表?它是怎么作到的?学习
要直接声明一个元组能够这样:优化
a = ("a","b","c") print(a)
输出编码
('a', 'b', 'c')code
这很容易,和列表的惟一区别就是把中括号换成了小括号。对象
但有一种特例须要特别说明,若是你要声明的元组中只包含一个元素,那你不能写成('a')
,而是要写成('a',)
,缘由也很明显,对于前者,Python解释器会认为()
是优先级运算符,而非元组声明,只有加入一个逗号才能确实指明这里是元组声明。rem
类型转换也很好理解,既然元组就是不能改变的列表,那固然能够直接由列表转换成元组,固然字符串什么的也是能够的:
a = tuple(["a","b","c"]) print(a)
输出
('a', 'b', 'c')
集合的定义是无序且具备惟一性的对象容器。这里集合这个概念其实就是中学数学里的集合,二者彻底一致。它具备两个特性:
a = {"a","b","c"} print(a)
输出
{'a', 'b', 'c'}
集合的声明很简单,同字典相似,使用大括号,区别就是集合中没有键值对。
和其它经常使用容器同样,集合也能够经过类型钻换建立:
a = set("aabbccddee") print(a)
输出
{'a', 'c', 'd', 'e', 'b'}
能够看到转换前的字符串是有重复字符的,但集合的特性决定了转换后必然是去重的。
前面说过了,集合是一个数学上的概念,天然也支持数学上的集合运算,即交集,并集和补集。
a = set("abcde") b = set("be12345gw") c = a.intersection(b) print(a) print(b) print(c)
输出
{'b', 'a', 'e', 'c', 'd'}
{'2', '3', 'b', '4', 'w', '5', 'e', '1', 'g'}
{'b', 'e'}
能够看出,交集就是求两个集合重复的元素集。
a = set("abcde") b = set("be12345gw") c = a.union(b) print(a) print(b) print(c)
输出
{'b', 'c', 'e', 'a', 'd'}
{'5', '3', 'b', 'g', '1', '4', '2', 'e', 'w'}
{'w', '5', '3', 'b', 'g', 'c', '1', '4', '2', 'e', 'a', 'd'}
并集也很好理解,就是两个集合的全部元素加起来,再去重。
补集也有叫差集,定义为b在a中的补集即a中的元素减去a和b的交集。对应的代码示例以下:
a = set("abcde") b = set("be12345gw") c = a.difference(b) print(a) print(b) print(c)
输出
{'b', 'c', 'd', 'a', 'e'}
{'4', '2', 'e', '1', '5', '3', 'w', 'b', 'g'}
{'a', 'd', 'c'}
若是要求a在b中的补集那就是反过来b.difference(a)
。
若是想和我同样复习一下集合的数学概念的,能够阅读百度百科。
集合在某些状况下极为有用,好比要对比两个字符串,求它们中重复的字符,在这种状况下将其转换为两个集合再求交集便可。
这里再也不一一举例,对于各类容器,只有常常思考,使用中对比其各自优缺点,才能真正运用自如。
对集合的增删改查相对简单,这里简单介绍一下:
a = set("abcde") #追加元素 a.add("f") print(a) #删除元素 a.remove("a") print(a)
输出
{'f', 'b', 'e', 'c', 'a', 'd'} {'f', 'b', 'e', 'c', 'd'}