列表
列表使用方括号括起来的[],每个元素以逗号分隔;
可以储存不同的数据类型数据
创建
创建空列表
>>> li = []
>>> print(type(li))
<class 'list'>
创建多元素列表
li = [1, 2, 3, 'abcd', 'city', 'collage', ["I", 'love', 'you']]
print(li, type(li))
[1, 2, 3, 'abcd', 'city', 'collage', ['I', 'love', 'you']] <class 'list'>
强转
sr = 'abcd'
li = list(sr)
print(li, type(li))
['a', 'b', 'c', 'd'] <class 'list'>
(1)拼接
li1 = ['I']
li2 = ["love", 'you']
print(li1 + li2)
['I', 'love', 'you']
(2)重复
li1 = ['I']
li2 = ["love", 'you']
print(li2*3)
['love', 'you', 'love', 'you', 'love', 'you']
(3)索引(偏移)[],切片[:],[::]
li = ['c', 'i', 't', 'y', 'city', 'college', 'zhejiang',['city', 'college', 'zhejiang']]
print(len(li))
print(li[0], li[-7])
print(li[:5])
print(li[::-1])
print(li[7][1])
8
c i
['c', 'i', 't', 'y', 'city']
[['city', 'college', 'zhejiang'], 'zhejiang', 'college', 'city', 'y', 't', 'i', 'c']
college
(4)列表的常见操作
增删改查
增
- append() 向列表里追加一个元素
li = ["City", "College"]
print(id(li))
li1 = ['a', 'b', 'c']
li.append(li1)
print(li, id(li))
sr = '城市学院'
li = []
for i in sr:
li.append(ord(i))
print(li)
4435955592
['City', 'College', ['a', 'b', 'c']] 4435955592
[22478, 24066, 23398, 38498]
- extend() 向列表里追加另一个列表的所有元素
li = ["City", "College"]
li1 = ['a', 'b', 'c']
li.extend(li1)
print(li)
['City', 'College', 'a', 'b', 'c']
- insert() 指定下标添加一个元素
li = ["City", "College"]
li1 = ['a', 'b', 'c']
li.insert(1,li1)
print(li)
####改
li = ['City', 'College', 'a', 'b', 'c']
li[4]='6666'
print(li)
####删
- pop() 通过下标删除
如果不指定索引,默认删除最后一个元素
删除指定索引对应的元素
li = ['a','b','c','d','e']
li.pop(2)
print(li)
['a', 'b', 'd', 'e']
- remove() 删除第一次遇到的指定元素
li = ['a', 'b', 'c', 'd', 'e','f','e']
li.remove('e')
print(li)
['a', 'b', 'c', 'd', 'f', 'e']
- del 删除列表释放空间
li = ['a', 'b', 'c', 'd', 'e','f','e']
del li[5]
print(li)
['a', 'b', 'c', 'd', 'e', 'e']
li = ['a', 'b', 'c', 'd', 'e','f','e']
del li
print(li)
报错
- clear()清空列表里所有元素
li = ['a', 'b', 'c', 'd', 'e','f','e']
li.clear()
print(li)
[]
查
- 遍历
(1)元素遍历
li = ['a', 'b', 'c']
for i in li:
print(i)
a
b
c
(2)索引遍历
li = ['a','b','c']
for i in range(len(li)):
print(li[i])
a
b
c
(3)枚举遍历
enumerate(). 对于一个可迭代的/可遍历的对象(如列表,字符串等)
将其组成一个索引序列,利用它,我们可以同时获得索引和值
li = ['a', 'b', 'c']
for i in enumerate(li, 2):
print(i)
(2, 'a')
(3, 'b')
(4, 'c')
li = ['a', 'b', 'c']
for index,value in enumerate(li[:3],2):
print(index,value)
2 a
3 b
4 c
tp = ('a', 'b', 'c')
for index, value in enumerate(tp[:3], 4):
print(index, value)
4 a
5 b
6 c
其他操作
#####计数
- count() 查找元素出现的次数
#####反转
-
reverse() 将列表元素取反
li = list('abcd') print(li) li.reverse() print(li) ['a', 'b', 'c', 'd'] ['d', 'c', 'b', 'a']
排序
- sort()
- sort(reverse=True) 将列表元素值进行降序排序
- sort(reverse=False) 将列表元素进行升序排序
li = [4, 2, 5, 9, 1]
li.sort(reverse=True)
print(li)
li.sort(reverse=False)
print(li)
[9, 5, 4, 2, 1]
[1, 2, 4, 5, 9]
-
小练习
- li1 = [‘a’, ‘b’, ‘c’, ‘d’]
li2 = [‘c’, ‘d’, ‘e’, ‘f’]
输出两个列表的交集
-
1.input()函数实现往空列表中添加元素,当输入"q"的时候,结束输入,并返回列表。
li = [] while True: a = input('请输入元素:') if a == 'q': break else: li.append(a) print(li) 请输入元素:asd 请输入元素:qwe 请输入元素:q ['asd', 'qwe']
-
2.随机生成30个0-10的随机整数,并统计每个数出现的次数,
返回的结果形式为[[0, 3], [1, 4], … , [10, 5]]li = [] a = [] import random for i in range(30): a.append(random.randint(0, 10)) #randint两边都是可以取到的 print(a) sum = 0 for i in range(0, 10): li.append([i, a.count(i)]) sum += a.count(i) print(li) print(sum) [7, 7, 4, 8, 0, 2, 6, 7, 1, 3, 6, 9, 1, 0, 5, 7, 6, 4, 5, 8, 5, 7, 9, 1, 2, 9, 10, 9, 3, 1] [[0, 2], [1, 4], [2, 2], [3, 2], [4, 2], [5, 3], [6, 3], [7, 5], [8, 2], [9, 4]] 29
赋值于深浅拷贝
赋值
赋值是对对象的引用
la = [1, 2, 3, 4, 5, 'a', ['b1', 'b2']] lb = la print(la) print(lb) print(id(la),id(lb)) print(la is lb) la[5]= 'aaa' print(la) print(lb) print(id(la),id(lb)) [1, 2, 3, 4, 5, 'a', ['b1', 'b2']] [1, 2, 3, 4, 5, 'a', ['b1', 'b2']] 4509876168 4509876168 True [1, 2, 3, 4, 5, 'aaa', ['b1', 'b2']] [1, 2, 3, 4, 5, 'aaa', ['b1', 'b2']] 4509876168 4509876168
深浅拷贝
深浅拷贝会创建新对象,内容是原对象的引用
三种实现方法:
-
切片操作[:]
la = [1, 2, 3, 4, 5, 'a', ['b1', 'b2']] lb = la lb2 = la[:] print(id(la),id(lb2)) 4342443976 4343154440
-
工厂函数list(li)
-
copy模拟内的copy函数
la = [1, 2, 3, 4, 5, 'a', ['b1', 'b2']] import copy lb_copy = copy.copy(la) la[6][0]='bbb' print(la) print(lb_copy) [1, 2, 3, 4, 5, 'a', ['bbb', 'b2']] [1, 2, 3, 4, 5, 'a', ['bbb', 'b2']]
la = [1, 2, 3, 4, 5, 'a', ['b1', 'b2']] import copy lb_copy = copy.copy(la) print(id(la),id(lb_copy)) la.append('test') #添加原子类型,不会影响lb_copy print(la) print(lb_copy) 4490620872 4492049096 [1, 2, 3, 4, 5, 'a', ['b1', 'b2'], 'test'] [1, 2, 3, 4, 5, 'a', ['b1', 'b2']]
深拷贝
import copy la = [1, 2, 3, 4, 5, 'a', ['b1', 'b2']] lb_deepcopy = copy.deepcopy(la) print(la, id(la)) print(lb_deepcopy, id(lb_deepcopy)) la[6][1] = 'aaa' print(la) print(lb_deepcopy) [1, 2, 3, 4, 5, 'a', ['b1', 'b2']] 4501035080 [1, 2, 3, 4, 5, 'a', ['b1', 'b2']] 4501033864 [1, 2, 3, 4, 5, 'a', ['b1', 'aaa']] [1, 2, 3, 4, 5, 'a', ['b1', 'b2']]
对象的引用
-
浅拷贝相当于我们只拷贝里一层,修改外层元素,会修改引用,让它们指向另一个位置
-
修改嵌套列表的元素,列表地址没有发生变化,指向的还是同一个位置
-
-
深拷贝拷贝对象的所有元素,包括多层嵌套的元素
-
因此,是开辟里一个新的内存储存区,和数据源没有关系了
-
- li1 = [‘a’, ‘b’, ‘c’, ‘d’]
列表解析式
li = []
for x in range(10):
li.append(x)
print(li)
print([x for x in range(10)])
print([x for x in range(10) if x%2==0])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 2, 4, 6, 8]
列表生成式,用来生成列表的特定的语法形式
sr = '城市学院'
print([ord(x) for x in sr])
[22478, 24066, 23398, 38498]
格式:
[表达式 for 迭代元素 in 可迭代对象]
实现原理:
迭代[可迭代对象]中的每一个元素
每迭代一次的结果赋值给对应的迭代元素,在通过表达式运算得到一个新的值
最后所有通过表达式计算的值以一个列表的形式返回
三目运算符
y =12
x = y+1 if y>10 else y-1
print(x)
13
带过滤功能格式
[exp for iter_val in iter if if_condtion]
li =[]
for iter_val in iter:
if if_condtion:
li.append(iter_val)
print(li)
name = ['Tom', 'jack', 'lucy']
subject = ['python', 'java', 'c', 'c++']
li = []
for i in name:
for j in subject:
li.append([i, j])
print(li)
[['Tom', 'python'], ['Tom', 'java'], ['Tom', 'c'], ['Tom', 'c++'], ['jack', 'python'], ['jack', 'java'], ['jack', 'c'], ['jack', 'c++'], ['lucy', 'python'], ['lucy', 'java'], ['lucy', 'c'], ['lucy', 'c++']]
name = ['Tom', 'jack', 'lucy']
subject = ['python', 'java', 'c', 'c++']
print([[i,j] for i in name for j in subject])
[['Tom', 'python'], ['Tom', 'java'], ['Tom', 'c'], ['Tom', 'c++'], ['jack', 'python'], ['jack', 'java'], ['jack', 'c'], ['jack', 'c++'], ['lucy', 'python'], ['lucy', 'java'], ['lucy', 'c'], ['lucy', 'c++']]
元组
有序
可以重复的
不可以更改的
符号使用()
元组的创建
空元组的创建
不能添加元素
tp =()
print(type(tp))
<class 'tuple'>
单元组的创建
需要在单元素后面添加逗号
tp =(1,)
print(type(tp))
<class 'tuple'>
多元素元组的创建
包含多种数据类型
(1)拼接
a = ('I',)
b = ('love', 'learning')
c = a + b
print(c)
('I', 'love', 'learning')
(2)重复
a = ('I',)
b = ('love', 'learning')
c = a * 3
print(c)
('I', 'I', 'I')
(3)索引(偏移)
(4)切片
查
索引查
切片查
index()
tp = ('1', '2', '3', '4', '5', 'a', 'b', 'c', ('d', 'e', 'f'))
print(tp.index('a'))
print(tp[8].index('d'))
5
0
增
不可增
删
不能删除某个元素,但可以全部删除
del
tp = ('1', '2', '3', '4', '5', 'a', 'b', 'c', ('d', 'e', 'f'))
del tp
print(tp)
其他操作
tp = ('1', '2', '3', '4', '5', 'a', 'b', 'c', ('d', 'e', 'f'))
print('1' in tp)
True
-
最大值和最小值
tp1 = (4,7,3,8,2) print(max(tp1),min(tp1)) 8 2
-
遍历
-
元素遍历
tp = ('a', 'b', 'c') for i in tp: print(i) a b c
-
索引遍历
tp = ('a', 'b', 'c') for i in range(len(tp)): print(tp[i]) a b c
-
枚举enumerate
tp = ('a', 'b', 'c') for i in enumerate(tp, 2): print(i) (2, 'a') (3, 'b') (4, 'c')
-
嵌套
tp = (((1,2,3),(4,5,6),(7,8,9)),((11,12,13),(14,15,16),(17,18,19)))
print(tp[1][1])
(14, 15, 16)