1.列表
列表使用方括号括起来的[ ],每个元素以逗号分隔
可以储存不同的数据类型数据
1.1特点
- 是一个有序的
- 可以重复的
- 可变类型
1.2创建
-
创建空列表
li=[]
-
创建多元素列表
li=[1,2,3,'a','gollege',['p','y','t']]
1.3拼接
li1=li2+li3
1.4重复
print(li1*3)
1.5索引(偏移),切片
li=['a','b','c','like','e','f']
print(len(li))
print((li[0],li[-1]))
print(li[1:5])
print(li[::-1])
print(li[3][2])
#输出结果
6
('a', 'f')
['b', 'c', 'like', 'e']
['f', 'e', 'like', 'c', 'b', 'a']
k
1.6增 删
-
增:
- append() 把列表为一个单位添加
- extend() 把列表中的元素取出一个个添加
- insert(位置,元素) 指定位置添加(添加的为一个单位)
li1=["one","two",'a','b'] li2=['lucky','boy'] li1.append(li2) print(li1) #['one', 'two', 'a', 'b', ['lucky', 'boy']] li1.extend(li2) #['one', 'two', 'a', 'b', 'lucky', 'boy'] li1.insert(1,li2) #['one', ['lucky', 'boy'], 'two', 'a', 'b'] li1.extend(li2) li1[2:5]=["aa",'bb','cc'] #['one', 'two', 'aa', 'bb', 'cc', 'boy']
-
删:
-
pop()
- 如果不指定索引,默认删除最后一个
- 可删除指定索引对应的元素
li1=["one","two",'a','b'] li1.pop() li1.pop(1) print(li1) #['one', 'a']
-
remove()
- 删除第一个遇到的指定元素
- 无指定元素会报错
li1=["one","two",'a','b','a'] li1.remove('a') print(li1) #['one', 'two', 'b', 'a']
-
del
- 删除指定位置元素
li1=["one","two",'a','b','a'] del li1[2] print(li1) #['one', 'two', 'b', 'a']
-
clear()
- 清空
li1=["one","two",'a','b','a'] li1.clear() print(li1) #[]
-
-
查
- 索引(1.5)
- 切片
1.7遍历
- 元素遍历
li1=["one","two",'a','b','a']
for i in li1:
print(i,end=' ')
#one two a b a
- 索引遍历
li1=["one","two",'a','b','a']
for i in range(len(li1)):
print(li1[i], end=" ")
#one two a b a
- 枚举遍历
- enumerate(list,起始值) 同时获得索引值和元素
li1=["one","two",'a','b','a']
for i in enumerate(li1,2):
print(i, end=" ")
#(2, 'one') (3, 'two') (4, 'a') (5, 'b') (6, 'a')
li1=["one","two",'a','b','a']
for a,b in enumerate(li1[:2],2):
print(a,b)
#2 one 3 two
1.8补充函数
- 堆和栈用列表可实现
- 计数count()
- 反转reverse()
li1=["one","two",'a','b','a']
li1.reverse()
print(li1)
#['a', 'b', 'a', 'two', 'one']
- 排序sort()
li1.sort()
#['a', 'a', 'b', 'one', 'two']
li1.sort(reverse=True)
#['two', 'one', 'b', 'a', 'a']
例:两个列表交集
li1=["a","b",'c','d','e','e','d']
li2=['c','d','e','f','g']
li3=[]
def se(sr):
for i in li3:
if(i==sr):
return False
return True
for i in li1:
for j in li2:
if i==j and se(i):
li3.append(i)
print(li3)
例:input()函数实现往空列表中添加元素,当输入“q”时,结束输入,并返回列表
li1=[]
while True:
str=input("请输入元素:")
if str=='q' :
break
li1.append(str)
print(li1)
例:随机生成30个0-10的随机整数,并统计每个数出现的次数,返回的结果形式为[[0, 3], [1, 4], … , [10, 5]]
import random
li=[]
li1=[0]*11
for i in range(0,30):
a=random.randint(0, 10)
li1[a]+=1
for i in range(11):
li.append([i,li1[i]])
print (li)
1.9拷贝
a=[1,2,3]
b=a
print(a,b)
a[1]=5
print(a,b)
[1, 2, 3] [1, 2, 3]
[1, 5, 3] [1, 5, 3]
- 深浅拷贝的三种方法:
- 切片[ : ]
- list(li)
- copy函数
la=[1,2,3,4,[1,2],6]
lb=la
lb2=la[:]
la[4][1]='a'
la[0]='a'
print(la,lb2)
#20399568 20400728
#['a', 2, 3, 4, [1, 'a'], 6] [1, 2, 3, 4, [1, 'a'], 6]
import copy
la=[1,2,3,4,[1,2],6]
lb3=la.copy()
print(id(la),id(lb3))
la[4][1]='a'
la[0]='a'
print(la,lb3)
#61426264 62341728
['a', 2, 3, 4, [1, 'a'], 6] [1, 2, 3, 4, [1, 'a'], 6]
la=[1,2,3,4,[1,2],6]
lb4=list(la)
la[4][1]='a'
la[0]='a'
print(id(la),id(lb4))
print(la,lb4)
#5261912 46612888
['a', 2, 3, 4, [1, 'a'], 6] [1, 2, 3, 4, [1, 'a'], 6]
#深拷贝!!!!!!!
import copy
la=[1,2,3,4,[1,2],6]
lb5=copy.deepcopy(la)
la[4][1]='a'
la[0]='a'
print(id(la),id(lb5))
print(la,lb5)
#50742776 50742016
['a', 2, 3, 4, [1, 'a'], 6] [1, 2, 3, 4, [1, 2], 6]
- 对象的引用
- 浅拷贝相当于我们只拷贝了一层,修改外层元素,会修改应用,让他指向另一个位置;修改嵌套列表的元素,列表地址没发生变化,还是指向同一位置。
- 深拷贝拷贝所有元素,包括多层嵌套元素。因此是开辟了一个新的内存村塾去,和数据源没关系。
1.10迭代
print([x for x in range(10)])
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- 实现原理
- 迭代[可迭代对象]中的每一个元素
- 每迭代一次的结果赋值给对应的迭代元素,在通过表达式运算得到一个新值
- 最后可以计算通过一个列表返回
domo
lis=['one','two','a','b']
lis1=['a','b','c']
#过滤
li=[i for i in lis if i not in lis1]
print(li)
#['one', 'two']
a=[1,2,3]
b=['a','b','c']
print([[i,j] for i in a for j in b])
#[[1, 'a'], [1, 'b'], [1, 'c'], [2, 'a'], [2, 'b'], [2, 'c'], [3, 'a'], [3, 'b'], [3, 'c']]