老王python之基本数据结构——元组和集合
一、元组
1、元组的特点
- 有序的集合
- 通过偏移来取数据
>>> a = (1,2,3)
>>> a[1:3]
(2, 3)
- 属于不可变的对象,不能在原地来修改数据,没有排序、修改等操作要想进行修改等操作的话,可以先转换成列表,修改数据之后,再用tuple()方法把它转换成元组
2、元组存在的意义
有了列表为什么还需要有元组?
元组不可变的好处:保证数据的安全,比如我们传给一个不熟悉的方法或者数据接口,确保方法或者数据接口不会改变我们的数据从而导致程序问题。
二、集合
集合没有顺序的概念,所以不能用切片和索引操作
1、创建集合
- 可变集合:
set()
>>> a = set('abc')
>>> a
set(['a', 'c', 'b'])
>>> type(a)
<type 'set'>
- 不可变集合:
frozenset()
查看一个对象是否是可迭代的,可以赋值之后使用python内置函数dir()查看它的方法里面有没有__iter__
这个方法,有的话代表可迭代,没有的话代表不可迭代
2、集合的添加操作
- #### 2.1 add方法
把传入的对象作为一个整体来进行添加
>>> a
set(['a', 'c', 'b'])
>>> a.add('python')
>>> a
set(['a', 'python', 'c', 'b'])
- #### 2.2 update方法
把传入的对象的每一个元素都分别进行添加
>>> a
set(['a', 'python', 'c', 'b'])
>>> a.update('python')
>>> a
set(['a', 'c', 'b', 'python', 'h', 'o', 'n', 'p', 't', 'y'])
3、集合的删除操作
- #### remove方法
删除集合中存在的元素,若输入的是不存在的元素,则抛出异常
>>> a
set(['a', 'c', 'b', 'python', 'h', 'o', 'n', 'p', 't', 'y'])
>>> a.remove('python')
>>> a
set(['a', 'c', 'b', 'h', 'o', 'n', 'p', 't', 'y'])
>>> a.remove(m'')
File "<stdin>", line 1
a.remove(m'')
^
SyntaxError: invalid syntax
4、集合的成员关系
- #### in 和 not in
和list以及tuple类似,查询某个元素是否再集合里面如果是用in来判断的话,在返回True,不在返回Falsse;用not in判断的话,则刚好相反
5、集合的交集、并集、差集
交集、并集和差集的概念和数学中的概念相同
- #### 交集: &
>>> a = set('abcde')
>>> b = set('cdefg')
>>> a & b
set(['c', 'e', 'd'])
- #### 并集: |
>>> a = set('abcde')
>>> b = set('cdefg')
>>> a | b
set(['a', 'c', 'b', 'e', 'd', 'g', 'f'])
- #### 差集: -
a - b 表示集合a中拥有而b中没有的元素构成的集合
>>> a = set('abcde')
>>> b = set('cdefg')
>>> a - b
set(['a', 'b'])
5、集合的去重功能
>>> a = [1,2,3]
>>> a.append(1)
>>> a.append(3)
>>> a
[1, 2, 3, 1, 3]
>>> set(a) #去除了重复的元素
set([1, 2, 3])
>>> list(set(a))
[1, 2, 3]
前面使用的示例都是可变集合set(),下面对不可变集合做增加和删除,查看效果
>>> a = frozenset('123')
>>> a
frozenset(['1', '3', '2'])
>>> a.add('python')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'add'
>>> a.remove(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'remove'