Python内置容器(1)——列表,元组
1.列表list
1.1定义和初始化 list
# 定义个空列表
In [1]: li = []
In [2]: type(li)
Out[2]: list
# 初始化list,list 中的元素没有类型要求,可以是任何类型
In [3]: li = [1,2,'a',['a',4]]
In [4]: li
Out[4]: [1, 2, 'a', ['a', 4]]
1.2列表的下标
python中列表的下标是从0开始的。
In [4]: li
Out[4]: [1, 2, 'a', ['a', 4]]
In [5]: li[2]
Out[5]: 'a'
In [6]: li[4]
---------------------------------------------------------------------------
IndexError
Traceback (most recent call last)
<iPython-input-6-5889debca501> in <module>()
----> 1 li[4]
IndexError: list index out of range
# 得到list 长度
In [7]: len(li)
Out[7]: 4
1.3 in关键字
在for循环中使用表示遍历list中的所有元素:
In [8]: for x in li:
...:
print x
...:
1
2
a
['a', 4]
in 也可以作为一个二元操作符使用,查找某个元素是否在list中存在:
In [9]: 'a' in li
Out[9]: True
del 删除list中某个元素:
In [10]: li
Out[10]: [1, 2, 'a', ['a', 4]]
In [11]: del li[0]
In [12]: li
Out[12]: [2, 'a', ['a', 4]]
1.4 在python中一切皆为对象,显然,list也是对象,针对于列表对象来说,常用的操作:
In [13]: dir(li)
Out[13]:
['__add__',
'__class__',
.........
'__str__',
'__subclasshook__',
'append',
'count',
'extend',
'index',
'insert',
'pop',
'remove',
'reverse',
'sort']
1.4.1查看list对象append方法的帮助信息:
In [14]: help(li.append)
In [15]: li
Out[15]: [2, 'a', ['a', 4]]
In [16]: li.append(666)
In [17]: li
Out[17]: [2, 'a', ['a', 4], 666]
1.4.2 extend 方法,接受一个迭代器,将迭代器的所有元素追加到list中:
In [17]: li
Out[17]: [2, 'a', ['a', 4], 666]
In [18]: li.extend(['abc','cba'])
In [19]: li
Out[19]: [2, 'a', ['a', 4], 666, 'abc', 'cba']
1.4.3 insert 方法
li.insert(2,'x') , li.insert(-1,'mm') ,在某个索引下标之前插入某个数据。
1.4.4 remove 方法
li.remove('a') ,从list中移除某个元素。
1.4.5 pop 方法
接受一个可选参数index,remove下标所指向的元素,并将钙元素返回,li.pop() , li.pop(2) :
In [19]: li
Out[19]: [2, 'a', ['a', 4], 666, 'abc', 'cba']In [20]: li.pop()
Out[20]: 'cba'
In [21]: li
Out[21]: [2, 'a', ['a', 4], 666, 'abc']
In [22]: li.pop(2)
Out[22]: ['a', 4]
In [23]: li
Out[23]: [2, 'a', 666, 'abc']
1.4.6 count 方法
返回某个值在list出现的次数, li.count('a')
1.4.7 index 方法,返回第一个匹配value的下标:
In [28]: li
Out[28]: [2, 'a', 666]
In [29]: li.index('a')
Out[29]: 1
In [30]: li.index('b')
---------------------------------------------------------------------------
ValueError
Traceback (most recent call last)
<ipython-input-30-4639cb7d3bae> in <module>()
----> 1 li.index('b')
ValueError: 'b' is not in list
# 还可以指定起始和结束查找的范围参数 li.index('a',2,6)
In [33]: li
Out[33]: [2, 'a', 666, 'a', 'a', 'b']
In [34]: li.index('a',2)
Out[34]: 3
1.4.8 sort 方法
直接修改list内容,不返回值. li.sort() ,还可以接受三个可选参数。L.sort(cmp=None, key=None, reverse=False)
1.4.9 reverse 方法。 li.reverse()
1.5 list的切片
li[i],li[a:b],li[a:e:b]--第三个参数为步长,index每次加几,默认为1
In [40]: li
Out[40]: ['b', 'a', 'a', 'a', 666, 2]
In [41]: li[2:4]
Out[41]: ['a', 'a']
####
In [43]: li[:2]
Out[43]: ['b', 'a']
###
In [44]: li[4:]
Out[44]: [666, 2]
## 对list 做一次深copy
In [45]: li[:]
Out[45]: ['b', 'a', 'a', 'a', 666, 2]
####
In [46]: li[2:4:2]
Out[46]: ['a']
## 用切片实现list 翻转
In [47]: li
Out[47]: ['b', 'a', 'a', 'a', 666, 2]
In [48]: li[::-1]
Out[48]: [2, 666, 'a', 'a', 'a', 'b']
# 得到下标为偶数的list
In [50]: li
Out[50]: ['b', 'a', 'a', 'a', 666, 2]
In [51]: li[::2]
Out[51]: ['b', 'a', 666]
# 得到下标为奇数的值
In [52]: li[1::2]
Out[52]: ['a', 'a', 2]列表的切片操作是一个复制操作,并不对原始列表进行修改。
2.元组 tuple
2.1 定义和初始化元组
In [1]: t = ()
In [2]: type(t)
Out[2]: tuple
In [3]: t = (1,2,3)
In [4]: t
Out[4]: (1, 2, 3)
2.2元组也支持下标和切片操作。
元组是不可变对象,不能对元祖的内容做修改
In [4]: t
Out[4]: (1, 2, 3)
In [5]: t[1]
Out[5]: 2
In [6]: t[1] = 100
---------------------------------------------------------------------------
TypeError
Traceback (most recent call last)
<ipython-input-6-4f066cd5e53f> in <module>()
----> 1 t[1] = 100
TypeError: 'tuple' object does not support item assignment
2.3 元组的不可变是相对的,因为元祖里面的内容可以是各种类型,如,元组的元素值为列表:
In [7]: t1 = ([2,3,4],[19,23,45])
In [8]: t1
Out[8]: ([2, 3, 4], [19, 23, 45])
In [9]: t1[0][2]
Out[9]: 4
In [10]: t1[0][2] = 100 #list 的值是可变的,可以被修改的
In [11]: t1
Out[11]: ([2, 3, 100], [19, 23, 45])
2.4 count , index 操作
In [12]: t
Out[12]: (1, 2, 3)
In [13]: t.count(2)
Out[13]: 1
In [14]: t.index(3)
Out[14]: 2
元组支持切片操作与列表的切片操作一样。
3.集合 set
3.1定义和初始化集合
列表和元组都是有序的,但是集合是无序的。
In [17]: s = {1,2,3}
In [18]: type(s)
Out[18]: set
3.2 集合中的元素不重复
In [19]: s = {1,1,1,12,2,2,3,4}In [20]: s
Out[20]: {1, 2, 3, 4, 12}
3.3python根据集合中的每个元素的hash值来判断是否重复,所以集合中的每个元素必须是可hash的对象。在python中如果一个对象有一个__hash__ 的方法,
表示该对象可hash.
In [21]: 1.__hash__ # 整数1 的对象有该方法,但是__hash__ 方法不能直接调用。
1.__hash__
hash() 函数直接返回某个对象的hash值。如hash(1)
集合不支持切片操作。
3.4集合的操作:
3.4.1 add 操作
In [21]: s
Out[21]: {1, 2, 3, 4, 12}
In [22]: s.add(100)
In [23]: s
Out[23]: {1, 2, 3, 4, 12, 100}
3.4.2 update 操作,迭代器作为参数,将迭代器中的所有元素追加到集合中
In [23]: s
Out[23]: {1, 2, 3, 4, 12, 100}
In [24]: s.update([101,102,103])
In [25]: s
Out[25]: {1, 2, 3, 4, 12, 100, 101, 102, 103}
3.4.3 remove 删除某个元素,若该元素不存在则报错
3.4.4 discard 删除某个元素,若该元素不存在则不做任何操作。
3.4.5 pop() 随机删除某个元素,并返回该元素
3.4.6 clear 清空集合。s.clear()
3.5 集合的运算
3.5.1 difference 两个集合的差集,不修改原来的两个集合
In [26]: s1 = {1,2,3,4,5,'a'}
In [27]: s2 = {4,5,7,8,'b','c'}
In [28]: s1.diff
s1.difference
s1.difference_update
In [28]: s1.difference(s2)
Out[28]: {1, 2, 3, 'a'}
# 减号可以直接求两个集合的差集
In [29]: s1 - s2
Out[29]: {1, 2, 3, 'a'}
3.5.2 difference_update 两个集合的差集,但修改原来的集合,不返回值
In [30]: s1
Out[30]: {1, 2, 3, 4, 5, 'a'}
In [31]: s2
Out[31]: {4, 5, 7, 8, 'b', 'c'}
In [32]: s1.difference_update(s2)
In [33]: s1
Out[33]: {1, 2, 3, 'a'}
In [34]: s2
Out[34]: {4, 5, 7, 8, 'b', 'c'}intersection 两个集合的交集,返回值,不修改原来的集合
3.5.3 intersection_update 两个集合的交集,无返回值,修改原来的集合
3.5.4 & , s1 & s2 直接求两个集合的交集
3.5.5 union 两个集合的并集
3.5.6 | , s1 | s2 也是求两个集合的并集
3.5.7 isdisjoint 查看两个集合是否有交集,返回bool, s1.isdisjoint(s2)
3.5.8 issubset 查看是否是子集
4. 列表,元组,集合之间的转换
4.1 list 函数
In [35]: list()
Out[35]: []
In [36]: list('hello')
Out[36]: ['h', 'e', 'l', 'l', 'o']
4.2 tuple 函数
4.3 set 函数
In [37]: t = (1,2,3)
In [38]: type(t)
Out[38]: tuple
In [39]: list(t)
Out[39]: [1, 2, 3]
将list转换为set的时候,若列表中存在重复元素,则移除重复的元素。
相关文章