今天看啥  ›  专栏  ›  胡老师11452

14.列表从入门到实践(进来先看目录)

胡老师11452  · CSDN  ·  · 2020-12-07 12:15

目录

一、列表的创建

二、列表的访问

1.索引

2.切片

三、对于列表的有关操作(增、删、改、查)

1.在列表中添加元素

2.删除list中的元素

3.修改列表中的值

4.列表的有关查询操作

四、列表的排序

1.sorted函数

2.sort方法

五、列表的嵌套

六、列表的高级应用

1.多维列表排序

2.列表推导式

3.构造多维列表

七、练习

八、第十课练习答案


列表是可变的序列(列表中可以存储多个数据,且可以对其中的数据进行新增、删除、修改和查询),列表是常用来存储同类项目的集合。

animals = ['bear','tiger','zebra','elephant'] #这是一个列表,可以将它理解为容器

一、列表的创建

1.names_of_students = [] # 创建一个空列表
2.name of department = ['信息工程学院'] # 包含1个元素
3.names_of_majors = ['软件技术','物联网应用技术','计算机网络技术'] # 以逗号分割项目,包含3个元素
4.words = [x for x in 'abc'] # 使用列表推导式将可迭代对象转为列表
5.numbers = list('123456789') # 使用类型构造函数将可迭代对象转为列表,

二、列表的访问

要访问列表中的值有索引和切片两种方式。(是不是感觉有些熟悉?是的,之前的字符串也是如此。)

1.索引

如何获得animals中的tiger?

列表中根据每个元素所在的下标取值就是索引。类似字符串,下标不是从1开始,而是从0开始。如果你想要2,那你的大脑中就应该想到第2位的下标是1。

列表中的值与索引[1]
列表中的值与反向索引[1]

在列表中根据索引取值:列表名称[下标]。

>>>print(animals[1])
tiger

>>>for index in range(len(animals)):
...    print(animals[index])
bear
tiger
zebra
elephant

2.切片

列表的切片操作[1]
>>>names_of_majors = ['软件技术','物联网应用技术','计算机网络技术']
>>>names_of_majors[1:3]
['物联网应用技术', '计算机网络技术']

>>>numbers = [1,2,3,4,5,6,7,8,9,0]
>>>print(numbers[2:4]) # 从索引2到4(不包含4)之间的值
[3, 4]
>>>print(numbers[5:]) # 从索引5到结束
[6, 7, 8, 9, 0]
>>>print(numbers[-2:]) # 从右侧倒数第二开始到结束
[9, 0]
>>>print(numbers[0:9:3]) # 从索引0到9(不包含9),每隔3个元素取1个值
[1,4,7]

三、对于列表的有关操作(增、删、改、查)

1.在列表中添加元素

(1)append方法

append将元素追加到最后,每次添加一个元素,格式为s.append(x),x可以是任意数值类型。

>>>animals = ['bear','tiger','zebra','elephant']
>>>animals.append('crocodile')
>>>animals
['bear', 'tiger', 'zebra', 'elephant', 'crocodile']

还有一点需要注意的是,在python的官方文档中提到s.append('x')等同于s[len(s):len(s)]=['x'],而s[len(s)]=['x']则会出现错误提示“list assignment index out of range”。这是因为索引方法只对已有下标有效,而s[len(s):len(s)]=['x']使用的是切片方法,可以突破已有下标的限制。

(2)insert方法

insert将元素插入到指定位置,格式为s.insert(i,x),i为插入位置的下标,x可以是任意数值类型。s.insert(i,x)等同于s[i:i]=x。

插入数值
>>>s=[1,2,3,4,5]
>>>s.insert(0,0)
>>>s
[0, 1, 2, 3, 4, 5]

插入列表
>>>s=[1,2,3,4,5]
>>>s.insert(3,[1,2])
>>>s
[1, 2, 3, [1, 2], 4, 5]

插入字典
>>>s=[1,2,3,4,5]
>>>s.insert(3,{'a':3})
>>>s
[1, 2, 3, {'a': 3}, 4, 5]

插入元组
>>>s=[1,2,3,4,5]
>>>s.insert(3,(0,0,0))
>>>s
[1, 2, 3, (0, 0, 0), 4, 5]

(3)extend方法

作用是实现两个列表的连接,格式为list1.extend(list2),等效于list1+=list2或者list1[len(list1):len(list1)]=list2。

#
>>>s=[1,2,3,4,5]
>>>t=[4,5,6]
>>>s.extend(t)
>>>s
[1, 2, 3, 4, 5, 4, 5, 6]


>>>s=[1,2,3,4,5]
>>>t=[4,5,6]
>>>s+=t
>>>s
[1, 2, 3, 4, 5, 4, 5, 6]


>>>s=[1,2,3,4,5]
>>>t=[4,5,6]
>>>s[len(s):len(s)]=t
>>>s
[1, 2, 3, 4, 5, 4, 5, 6]

>>>s=[1,2,3,4,5]
>>>t=[4,5,6]
>>>s.extend(t[-2:])
>>>s
[1, 2, 3, 4, 5, 5, 6]

2.删除list中的元素

(1)del函数

>>>s=[1, 2, 3, 4, 5, 5, 6]
>>>del s[0] # 删除指定索引的值
>>>s
[2, 3, 4, 5, 5, 6]
>>>del s[:2] # 删除切片区域内的值
>>>s
[4, 5, 5, 6]
>>>del s[:] # 删除全部的值
>>>s
[]

(2)clean方法

删除list中的所有元素,等同于del s[:]。

>>>words=['a','b','c','d']
>>>words
['a', 'b', 'c', 'd']
>>>words.clear()
>>>words
[]

(3)remove方法

根据值删除列表中与其相同的第一个元素。

>>>words=['a','b','c','b','d']
>>>print(words)
['a','b','c','b','d']
>>>words.remove('b')
>>>print(words)
['a','c','b','d']

(4)pop方法

根据索引删除列表中的元素,同时返回删除的元素。格式为s.pop(i),i是索引值,缺省时默认为-1,即删除列表中的最后一个值。

>>>numbers = [1,2,3,4,5,6]
>>>number1 = numbers.pop()
>>>print(number1)
6
>>>print(numbers)
[1, 2, 3, 4, 5]
>>>number2 = numbers.pop(1)
>>>print(number2)
2
>>>print(numbers)
[1, 3, 4, 5]

思考:如何删除列表中所有的'b'。

3.修改列表中的值

(1)利用索引和切片修改列表中的值

>>>odd_numbers = [1,3,5,'aa',9]
>>>odd_numbers[3] = 7 # 修改单个值
>>>odd_numbers
[1, 3, 5, 7, 9]


>>>odd_numbers[0:3] = [2,2,2] # 修改多个值,切片长度和替换值的数量相等,原有列表长度不变
>>>odd_numbers
[2, 2, 2, 7, 9]

>>>odd_numbers[0:2] = [3,3,3] # 修改多个值,切片长度小于替换值的数量,原有列表长度变大
>>>odd_numbers
[3, 3, 3, 2, 'aa', 9]

>>>odd_numbers[0:3] = [1,2,3,4] # 修改多个值,切片长度小于替换值的数量,原有列表长度再次变大
>>>odd_numbers
[1, 2, 3, 4, 2, 'aa', 9]

>>>odd_numbers[::2] = ['bb','cc','dd','ee'] # 根据步长修改列表中的元素
>>>odd_numbers
['bb', 2, 'cc', 4, 'dd', 'aa', 'ee']

>>>odd_numbers[0:4] = ['aa'] # 修改多个值,切片长度大于替换值的数量,原有列表长度变小
>>>odd_numbers
['aa', 'dd', 'aa', 'ee']

(2)列用for循环和索引修改列表中的值

将['aa', 'dd', 'aa', 'ee']中的'aa'修改为'cc'

>>>odd_numbers = ['aa', 'dd', 'aa', 'ee']
>>>for i in range(len(odd_numbers)):
...     if odd_numbers[i] == 'aa':
...         odd_numbers[i] = 'cc'
...         
>>>print(odd_numbers)
['cc', 'dd', 'cc', 'ee']

4.列表的有关查询操作

# 是否包含某个元素?
>>>odd_numbers = ['cc', 'dd', 'cc', 'ee']
>>>if 'cc' in odd_numbers:
...     print(True)
True

# 列表中有几个'cc'
>>>odd_numbers.count('cc')
2
>>>odd_numbers.count('aa')
0

# 返回列表中某个元素的索引值
>>>odd_numbers.index('cc')
0

odd_numbers.index('aa')  # 如果列表中不包含这个元素,则出现异常
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: 'aa' is not in list

# 获取列表的长度
>>>len(odd_numbers)
4

# 查找列表中的最大值
>>>max(odd_numbers)
'ee'

# 查找列表中的最小值
>>>min(odd_numbers)
'cc'

四、列表的排序

1.sorted函数

sorted是python的内建函数,可以对所有可迭代对象进行排序。使用sorted对列表进行排序将得到一个新的列表,而原列表不会改变。sorted函数的语法:sorted(iterable, key=None, reverse=False)

iterable:可迭代对象

key:主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。(关于key的使用详见本文第六部分 列表的高级应用)

reverse:排序规则,reverse = True 降序 , reverse = False 升序(默认)。

>>>odd_numbers = [7,1,3,9,5]
>>>sorted(odd_numbers) # 简单排序,默认为升序
[1, 3, 5, 7, 9]
>>>odd_numbers
[7, 1, 3, 9, 5]
>>>sorted(odd_numbers,reverse = True) # 降序
[9, 7, 5, 3, 1]

# 获得排序后的列表
>>>sorted_odd_numbers = sorted(odd_numbers,reverse = True)
>>>sorted_odd_numbers
[9, 7, 5, 3, 1]

2.sort方法

sort是列表的一种方法,使用它将直接改变原有列表。sort方法的语法:list.sort( key=None, reverse=False)。key和reverse的作用与sorted函数相同。

from random import randint
numbers = []
for i in range(10):
    numbers.append(randint(0,101))
print(numbers)
[74, 34, 20, 30, 35, 80, 60, 95, 20, 4]

numbers.sort()
print(numbers)
[4, 20, 20, 30, 34, 35, 60, 74, 80, 95]

numbers.sort(reverse=True)
print(numbers)
[95, 80, 74, 60, 35, 34, 30, 20, 20, 4]

五、列表的嵌套

列表的嵌套即在列表中在嵌套列表,如下所示:

>>>data = [['Tom',21,'20202501'],['Jim',20,'20181717'],['Susan',19,'20201908']]
>>>data
[['Tom', 21, '20202501'], ['Jim', 20, '20181717'], ['Susan', 19, '20201908']]
>>>len(data)
3

data中包含有3个子列表,每个子列表包含有姓名、年龄和学号三个信息。

获得Jim的所有信息

>>>data[1]
['Jim', 20, '20181717']

获得Jim的年龄

>>>data[1][1]
20

修改Jim的学号

>>>data[1][2] = '20181720'
>>>data
[['Tom', 21, '20202501'], ['Jim', 20, '20181720'], ['Susan', 19, '20201908']]

将性别添加到年龄后面

>>>data[0].insert(2,"男")
>>>data[1].insert(2,"男")
>>>data[2].insert(2,"女")
>>>data
[['Tom', 21, '男', '20202501'], ['Jim', 20, '男', '20181720'], ['Susan', 19, '女', '20201908']]

将Susan的信息从列表中删除

>>>data.pop()
['Susan', 19, '女', '20201908']
>>>data
[['Tom', 21, '男', '20202501'], ['Jim', 20, '男', '20181720']]

或者
>>>del data[-1]
>>>data
[['Tom', 21, '男', '20202501'], ['Jim', 20, '男', '20181720']]

删除所有学号信息

data = [['Tom',21,'20202501'],['Jim',20,'20181717'],['Susan',19,'20201908']]
for i in data:
    i.pop()
print(data)

[['Tom', 21], ['Jim', 20], ['Susan', 19]]

获得所有人的姓名

data = [['Tom',21,'20202501'],['Jim',20,'20181717'],['Susan',19,'20201908']]
names = []
for i in data:
    names.append(i[0])
print(names)

['Tom', 'Jim', 'Susan']

六、列表的高级应用

1.多维列表排序

将以上data中的信息按照子列表中的学号信息升序排序

我们可以使用sort或sorted进行排序,按照要求我们需要根据个人的学号信息进行排序,它在个人信息中索引是2。

这里我们将使用key这个参数,如前所述,它的作用是指定排序比较的元素,key参数的值应该是一个获取比较元素的函数,此函数将在每个元素比较前被调用。

data = [['Tom',21,'20202501'],['Jim',20,'20181717'],['Susan',19,'20201908']]
data.sort(key = lambda x:x[2]) # 利用lambda构造函数
print(data)

[['Jim', 20, '20181717'], ['Susan', 19, '20201908'], ['Tom', 21, '20202501']]

也可以直接定义一个函数作为key的值

def getindex(index):
    return index[2]


data = [['Tom', 21, '20202501'], ['Jim', 20, '20181717'], ['Susan', 19, '20201908']]
data.sort(key=getindex)
print(data)

[['Jim', 20, '20181717'], ['Susan', 19, '20201908'], ['Tom', 21, '20202501']]

再看一个列表中字典的排序,要求根据key为1的值进行排序。[2](在原文基础上有一定改动)

L = [{1:5,3:4},{1:3,6:3},{1:1,2:4,5:6},{1:9}]
def f2(a):
    return a[1]
L.sort(key = f2)
print(L)

[{1: 1, 2: 4, 5: 6}, {1: 3, 6: 3}, {1: 5, 3: 4}, {1: 9}]

2.列表推导式

列表推导式(list comprehension)也称为列表解析式,是一种创建列表的简洁语法。

假设要生成一个1到100以内所有偶数,我们常规的做法是:

numbers = []
for i in range(1,101):
    if i % 2 == 0:
        numbers.append(i)
print(numbers)

使用列表推导式我们可以简化为:

numbers = [x for x in range(1,101) if x % 2 == 0]
print(numbers)

是不是感觉简化了很多,列表推导式只有一行代码。

列表推导式的结构:[添加的目标元素 for 变量 in 可迭代的序列 if 筛选的条件]

再看几个例子:

# 将10以内所有奇数的平方存入列表
numbers = [x**2 for x in range(1,11) if x % 2 != 0]
print(numbers)

[1, 9, 25, 49, 81]

# 将列表中所有起始为‘b’的单词存入列表
word_startwith_b = [x for x in ['red','blue','green','black','pink'] if x.startswith('b')]
print(word_startwith_b)
['blue', 'black']

# 将列表中所有单词存入列表
animals = [x for x in ['lion','tiger',1,333,'elephant'] if str(x).isalpha()]
print(animals)
['lion', 'tiger', 'elephant']

3.构造多维列表

原意是创建一个包含3个空的子列表的列表,然后将0存入其中第2个列表下,但是输出后发现,三个子列表都新增了0。

观察发现,3个子列表都是同一个id。

numbers = [[]] * 3
numbers
[[], [], []]
numbers[1].append(0)
numbers
[[0], [0], [0]]
for i in range(len(numbers)):
...     print(id(numbers[i]))
...     
4472764480
4472764480
4472764480

正确的方法如下:

numbers = [[] for i in range(3)]
print(numbers)

for index in range(len(numbers)):
    numbers[index].append(index)
    print(id(numbers[index]))

print(numbers)


[[], [], []]
4414227648
4414217216
4414678208
[[0], [1], [2]]

七、练习

1.列表基础练习

lst = [2, 5, 6, 7, 8, 9, 2, 9, 9]

完成以下任务:
1.在列表的最后插入100
2.将30插入到列表的中间位置
3.将索引为3的元素删除
4.将[22,33,44]合并到列表的最后
5.将列表中的元素从大到小、从小到大各排序一次。

2.列表复杂练习

lst	= [11, 22, 33, [44, 55, 66, 77, [88, 99, 100, 110]]]

编程完成以下任务:
1.输出lst的长度
2.输出lst中元素的和
3.将55修改为5555
4.输出99
5.将[7788,8899]插入到66的后面
6.找出列表中所有元素的最大值

在完成以上操作后,思考回答以下问题:
1.lst[-1][-1][-2]是什么?
2.len(lst[-1][-1])是多少?
3.lst[-1][1:3]是什么?
4.lst[-1][-1][1:-2]是什么?

3.有一个已经排好序的列表[23, 24, 30, 32, 40, 46, 61, 65, 87, 96],用户随机输入一个数,将它按原有规律插入列表中。

4.products =   [["iphone",6888],["MacPro",14800],["小米6",2499],["Coffee",31],["Book",60],["Nike",699]],需打印出以下格式。

------  商品列表 ------
0  iphone    6888
1  MacPro    14800
2  小米6      2499
3  Coffee    31
4  Book      60
5  Nike      699

5.在上题基础上,编写一个程序,实现不断询问用户想买什么,提示用户输入商品编号,就把对应的商品添加到购物车里,同时显示当前购物车中的商品列表和总价格,最终用户输入q退出时,打印购买的商品列表及总价格。

八、第十课练习答案

1.有一分数序列,2/1、3/2、5/3、8/5、13/8、21/13……,求出这个数列的前20项之和。

x = 2
y = 1
summary = 0
for i in range(20):
    summary = x/y
    x,y = x+y,x
    print(x,y)

print('数列的前20项之和为%.4f'%summary)

2.求1+2!+3!+4!+……+20!的值。

summary = 0
for i in range(1,21):
    n = 1
    for j in range(1,i+1):
        n *= j
    summary += n

print('1+2!+3!+4!+……+20!的值为%i'%summary)

3.将“hello world”用相反顺序打印出来。

words = "hello world"
print(words[::-1])

4.判断字符串中是否有连续三个英文单词。如:"Hello World hello"的结果为True、"He is 123 man"的结果为False、"1 2 3 4"结果为False、"bla bla bla bla"的结果为True。(提醒:可能需要用到split()、isalpha()、isdigit()等函数)

words = "He is 123 a 23 good man"
sum = 0
for word in words.split():
    if word.isalpha():
        sum += 1
        if sum == 3:
            print(True)
            break
    elif word.isdigit():
        sum = 0
else:
    print(False)

参考文献:

[1]Python3列表. https://www.runoob.com/python3/python3-list.html

[2] https://www.zhihu.com/question/36280272




原文地址:访问原文地址
快照地址: 访问文章快照