python 列表
列表
当我们有多个数据需要保存的时候,可以考虑使用列表。列表是有序的,用户可以通过下标的方式对列表进行切片,还可以使用下标来修改列表的元素。
1.列表的表示方式
names = ["tank","tom","frank","jerry","honey"]
# 使用list传入一个可迭代对象进行转换
>>> words = list(("a","b",'c'))
>>> print(words)
['a', 'b', 'c']
2.列表的操作
2.1 增加元素
append # 在列表的最后面追加数据
insert # 在索引之前加入一个对象
extend # 把另外一个可迭代对象融合到一起
#列表的最后添加一个元素
>>> names = ["tank","tom","frank","jerry","honey"]
>>> names.append("jj")
>>> names
['tank', 'tom', 'frank', 'jerry', 'honey', 'jj']
# 在索引2的位置添加xinlin
# insert(index,object)
>>> names.insert(2,"xinlin")
>>> names
['tank', 'tom', 'xinlin', 'frank', 'jerry', 'honey', 'jj']
# 拼接一个可迭代对象,后面是传入一个可迭代对象。
>>> words
['b', 'c', 'z', 'a']
>>> names.extend(words)
>>> names
['tank', 'tom', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z', 'a']
2.2 删除元素
pop # 默认删除列表最后一个数据,并返回。根据下标取出元素。
remove # 删除指定的元素,如果有重复的元素会先删除索引较小的,删除元素不存在会报错。
clear # 清空列表
del # 也可以删除指定元素
# pop 方法
>>> names
['tank', 'tom', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z', 'a']
>>>
>>> names.pop()
'a'
>>> names
['tank', 'tom', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z']
>>> names.pop(0)
'tank'
>>> names
['tom', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z']
# remove
>>> names = ['tom', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z']
>>> names.remove("jj")
>>> names
['tom', 'xinlin', 'frank', 'jerry', 'honey', 'b', 'c', 'z']
# del 删除指定元素
>>> names
['tom', 'xinlin', 'frank', 'jerry', 'honey', 'b', 'c', 'z']
>>>
>>> del [names[0]]
>>> names
['xinlin', 'frank', 'jerry', 'honey', 'b', 'c', 'z']
# 清空列表
>>> names.clear()
>>> names
[]
2.3 修改元素
使用下标直接修改。
>>> names = ['tom', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z']
>>> names[0] = 'zeop'
>>> names
['zeop', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z']
2.4 查询元素
index # 查看元素的索引,如果没有该元素会报错。
count # 查看元素出现的次数。
in # 查看元素是否在列表中。
# 返回元素的索引
>>> names
['zeop', 'xinlin', 'frank', 'jerry', 'honey', 'jj', 'b', 'c', 'z']
>>> names.index('xinlin')
1
# 查看元素出现的次数
>>> names = ['zeop', 'xinlin', 'frank', 'jerry', 'honey','a','a','a']
>>> names.count('a')
3
# 查看元素是否在可迭代对象中,返回布尔值
>>> names = ['zeop', 'xinlin', 'frank', 'jerry', 'honey','a','a','a']
>>> "frank" in names
True
3.列表的遍历
2.1 while遍历
# while 遍历
names = ["frank",'tom','jerry','pink panther','spike']
tag = 0
while tag < len(names):
print(names[tag])
tag +=1
2.2 for 遍历
names = ["frank",'tom','jerry','pink panther','spike']
for i in names:
print(i)
4.变量的替换
# 中间量替换
a = 20
b = 10
c = b
b = a
a = c
print("a:",a,"\nb:",b)
# 逻辑运算,只限于数字
a = 10
b = 20
a = a + b
b = a - b
a = a - b
print("a:",a,"\nb:",b)
# python 特有的
a = 10
b = 20
a, b = b, a
print("a:",a,"\nb:",b)
5.列表的排序
>>> num = [1,4,5,2,3,7,9]
>>> num.sort()
>>> num
[1, 2, 3, 4, 5, 7, 9]
# 反转排序
>>> num.sort(reverse=True)
>>> num
[9, 7, 5, 4, 3, 2, 1]
# 内置函数sorted,不会改变列表值,会生成一个新的列表。
>>> num = [1,4,5,2,3,7,9]
>>> sorted(num)
[1, 2, 3, 4, 5, 7, 9]
>>> x = sorted(num)
>>> x
[1, 2, 3, 4, 5, 7, 9]
>>> num
[1, 4, 5, 2, 3, 7, 9]
6.列表元素反转
# 1、通过切片的方式
>>> names = ["tank","tom","frank","jerry","honey"]
>>> names[::-1]
['honey', 'jerry', 'frank', 'tom', 'tank']
# 直接反转列表会更改列表内容
>>> names
['tank', 'tom', 'frank', 'jerry', 'honey']
>>> names.reverse()
>>> names
['honey', 'jerry', 'frank', 'tom', 'tank']
7.可变类型与不可变类型
python中的数据都是保存在内存里面的。数据类型可以分为两类:
可变数据类型 : 列表、字典、集合
不可变数据类型:字符、数字、元组
可以使用id()函数查看内存地址。
不可变数据类型,如果修改内存地址火发生变化。
可变数据类型不会发生变化。
不可变数据类型
# 不可变数据类型
a = 12
b = a
print(a,b)
print("修改前:a的内存地址: %X,b的内存地址: %X" % (id(a), id(b)))
a = 24
print("修改后:a的内存地址: %X,b的内存地址: %X" % (id(a), id(b)))
print(a,b)
12 12
修改前:a的内存地址: 7FFC415CA300,b的内存地址: 7FFC415CA300
修改后:a的内存地址: 7FFC415CA480,b的内存地址: 7FFC415CA300
24 12
原理图解
修改前
修改后
可变数据类型
names = ["tom","squire","zep"]
c = names
print(names,c)
print("修改前内存地址:names: %X ,c: %X" % (id(names), id(c)))
names[0] = 'kindon'
print("修改后内存地址:names: %X ,c: %X" % (id(names), id(c)))
print(names,c)
['tom', 'squire', 'zep'] ['tom', 'squire', 'zep']
修改前内存地址:names: 1E268BF5188 ,c: 1E268BF5188
修改后内存地址:names: 1E268BF5188 ,c: 1E268BF5188
['kindon', 'squire', 'zep'] ['kindon', 'squire', 'zep']
原理图解
修改后,还是指向同一内存地址所以c的值也会改变。
8.列表的复制
浅复制
# 这样复制列表会有一个问题就是names 和x的内存地址空间都是指向同一地址空间,这样地址空间中存储的数据发生了变化变量names和x都会变。
names = ["tom", "jerry", "spaik", "john"]
x = names
names[0]= '张三'
print(names,x)
方法一
# 这样新的变量生成了新的地址空间,就不会互相影响。
names = ["tom", "jerry", "spaik", "john"]
x = names.copy()
names[0] = '张三'
print("names的地址空间0x%X, x的地址空间0x%X" % (id(names), id(x)))
print(names,x)
方法2
import copy
names = ["tom", "jerry", "spaik", "john"]
x = copy.copy(names)
names[0] = '张三'
print("names的地址空间0x%X, x的地址空间0x%X" % (id(names), id(x)))
print(names,x)
方法3
names = ["tom", "jerry", "spaik", "john"]
x = names[::]
names[1] = "老五"
print("names的地址空间0x%X, x的地址空间0x%X" % (id(names), id(x)))
print(names,x)
深复制
浅复制默认只复制一层,深复制必须使用copy模块,
# 浅复制,对于这种嵌套列表,里面的列表还是指向同一内存地址;所以在改变了嵌套列表中的值之后还是影响了浅复制的变量。
import copy
words = ['linsan', "juice",[1,2,3] ,"john", "linlin"]
words1 = words.copy()
words[2][0] = 1000
print(words1)
['linsan', 'juice', [1000, 2, 3], 'john', 'linlin']
# 深复制
import copy
words = ['linsan', "juice",[1,2,3] ,"john", "linlin"]
words1 = words.copy()
words2 = copy.deepcopy(words)
words[2][0] = 1000
print(words1)
print(words2)
# ------深复制的结果------
['linsan', 'juice', [1000, 2, 3], 'john', 'linlin']
['linsan', 'juice', [1, 2, 3], 'john', 'linlin']
pythontutor.com
9.列表的嵌套
把十个老师随机分到三个办公室中。
import random
teachers = ["A", "B", "C", "D", "E", "F", 'G', "H"]
zoons = [[], [], []]
for i in teachers:
zoons[random.randint(0,2)].append(i)
print(zoons)
# 使用for的方式
for i in teachers:
zoom = random.choice(zoons)
zoom.append(i)
print(zoons)
# 把每个办公室的老师列出来
for i in teachers:
zoom = random.choice(zoons)
zoom.append(i)
# 一般要引用下標的使用while
# for也可以使用下標
for i ,zoom in enumerate(zoons):
print("辦公室%d ,有老師:" % i, end=" ")
for z in zoons[i]:
print(z, end=" ")
print()
10.列表推导式
一般只用于生成简单的列表
# 最简答的列表推导式
points = [i for i in range(10)]
print(points)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 含有条件的列表推导
points2 = [x for x in range(10) if x % 2 == 0]
print(points2)
[0, 2, 4, 6, 8]
# 含有两个参数的推导式
points3 = [(y, z) for y in range(2) for z in range(3)]
print(points3)
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]
11.练习
找出列表中最大的数。
nums = [1, 3, 4, 6, 2, 54, 67, 32, 4, 3, 9, 8]
"""
假設第一個數字為最小的一個數用它去和其它的數進行比較,如果比它大就把它從新
賦值,如果比它小就忽略。
"""
x = nums[0]
for i in nums:
if x < i:
x = i
print(x)
找出列表中最大的数并找到下标。
# 方法一
nums = [1, 3, 4, 6, 2, 54, 67, 32, 4, 3, 9, 8]
x = nums[0]
for i in nums:
if x < i:
x = i
print('列表中最大的數%d,下標是:%d' % (x, nums.index(x)))
# 方法二
nums = [1, 3, 4, 6, 2, 54, 67, 32, 4, 3, 9, 8]
i = 0
num = nums[0]
while i < len(nums):
if num < nums[i]:
num = nums[i]
index = i
i +=1
print('列表中最大的數是:%d,索引是%d' % (num, index))
删除列表中的空字符串
# 會有bug
words = ["zhangsna", "ahahha", "joker", "","","wa","ji",""]
for i in words:
if i == "":
words.remove(i)
print(words)
['zhangsna', 'ahahha', 'joker', 'wa', 'ji', '']
# 非空字符串进行新的赋值
new_words = []
words = ["zhangsna", "ahahha", "joker", "","","wa","ji",""]
for i in words:
if i != "":
new_words.append(i)
words = new_words
print(words)
['zhangsna', 'ahahha', 'joker', 'wa', 'ji']
words = ["zhangsna", "ahahha", "joker", "","","wa","ji",""]
i = 0
while i < len(words):
if not words[i]:
words.remove(words[i])
i -=1
i +=1
print(words)
['zhangsna', 'ahahha', 'joker', 'wa', 'ji']
把列表1-100的数字转换为三个一组的嵌套列表。比如[1,2,3,4,5,6,......,100]变为[[1,2,3],[4,5,6],[7,8,9],...]
# 把列表1-100的数字转换为三个一组的嵌套列表。比如[1,2,3,4,5,6,......,100]变为[[1,2,3],[4,5,6],[7,8,9],...]
m = [i for i in range(1,101)]
points = [m[x:x+3] for x in range(0,101,3)]
print(points)