一、列表的定义
python内置了一种数据类型是列表:list 。list 是一种有序的集合,可以随时添加和删除其中的元素。有点类似于我们C语言中的数组,但是数组只可以存放同一类型的数据,尔列表list可以存放任意数据类型的元素,他是一种或多种的数据元素的集合。
1. 列表的定义
列表内可以添加同种类型元素; l1 = [1,2,3,4,5] print(l1,type(l1)) 也可以是多种类型元素; l2 = [1, 4.5, 1+2j, "hello"] print(l2, type(l2))
2、列表的的特性: 索引, 切片, 连接, 重复, 成员操作符;
students_name = ['yu','tao','natasha','steak','apple'] (1). 索引 正向索引 print(students_list[0]) 反向索引 print(students_list[-1]) (2). 切片 print(students_list[::-1]) (3)反向输出 s = "hello xiao mi" # "mi xiao hello" print(s.split) print(s.split[::-1]) print(" ".join(s.split()[::-1])) (4). 重复 print(students_list*3) (5). 连接 print(students_list + ['orange', 'banana']) (6). 成员操作符 print('apple' in students_list) print('fentiao' in students_list) (7). for循环遍历列表元素 for student in students_list: print("学生姓名:%s" %(student)) (8). 列表里面嵌套列表 goods = [ ['apple', 2, 100], ['banana', 3, 50], ['computer', 4000, 13] ] # 嵌套索引 print(goods[0]) print(goods[1][2])
3、练习:按要求输出列表内容
假定有下面这样的列表:
names = ['fentiao', 'fendai', 'fensi', 'apple']
输出结果为:'I have fentiao, fendai, fensi and apple.';并求列表的长度
考察点:
切片:
字符串的join方法:
names = ['fentiao', 'fendai', 'fensi', 'apple']
print("I have " + ",".join(names[:-1]) + ' and ' + names[-1])
print(len(names))

4、列表的增加
name_list = ["apple","banana","orange"]
(1) append: 追加, 追加元素到列表的最后;
name_list.append('westos')
print(name_list)
(2) name_list.append(['linux', 'c#', 'java'])
print(name_list)
(3) insert: 添加元素到指定索引的前面;
name_list.insert(0, 'java')
print(name_list)
(4) extend: 追加多个元素到列表中;
name_list.extend(['c', 'C++'])
print(name_list)
5、列表的删除
name_list = ["apple","banana","westos","redhat"]
(1)remove: 删除指定的值
name_list.remove('apple')
print(name_list)
(2) name_list.pop(): pop删除指定索引的值, 默认情况删除最后一个元素;
a = name_list.pop(), a就是删除的那个元素;
name_list.pop(0)
print(name_list)
(3) clear: 清空列表
name_list.clear()
print(name_list)
(4) del删除列表元素
del name_list[0]
del name_list[-1]
del name_list[1:]
del name_list[:-1]
del name_list
6、列表的修改
name_list = ["apple","banana",“orange”,"westos","redhat"](1)通过索引, 重新赋值;
name_list[0] = 'redhat'
print(name_list)
(2)通过切片重新赋值
name_list[:2] = ['java', 'C']
print(name_list)
7、列表的查看
name_list = ["apple","banana",“orange”,"westos","redhat"
(1) 查看指定元素的索引值;print(name_list.index('redhat'))
print(name_list.count('fendai'))
(2) 按照指定的ASCII码进行排序的;
name_list.sort()
print(name_list)
name_list.sort(key=str.lower)
print(name_list)
(4)列表的反转; 类似于name_list[::-1]
print(name_list[::-1])
name_list.reverse()
print(name_list)
8、练习:用户登陆系统
1). 已知多个用户名和密码分别保存在列表中;
2). 判断用户名是否存在,
如果登陆的用户不存在,则报错;;
如果用户存在, 则判断密码是否正确:
如果正确, 输出用户登陆成功;
如果不正确, 输出登陆失败;
3). 为防止黑客暴力**密码, 登陆最多有3次机会;
user_name = ['root', 'student']
user_passwd = ['redhat', 'yutao']
trycount = 0
while trycount < 3:
trycount += 1
name = input("请输入用户名:")
# 1.判断用户是否存在?
if name in user_name:
# 2. 判断密码是否正确?
passwd = input("密码:")
# 找出系统存储的inuser用户的密码;
index = user_name.index(inuser) # inuser='root', index=0 找到用户名的索引值
passwds = user_passwd[index] # passwd='redhat' 在密码列表中通过索引值找出相对应的密码
if passwd == passwds:
print("%s登陆成功!" %(name))
break
else:
print("密码错误!")
else:
print("用户名%s不存在" %(name))
else:
print("尝试次数超过3次!")
9、列表的嵌套
import pprintli1 = [
[1, 2, 3],
[2, 3, 4],
[3, 4, 5]
]
li2 = [
[2, 3, 4],
[1, 2, 3],
[1, 2, 3]
]
# numpy, pandas, matplotlib
result = [
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]
]
# i : 0, 1, 2
for i in range(len(li1)):
# j: 0, 1, 2
for j in range(len(li1[i])):
# [0][0], [0][1], [0][2]
# [1][0]
result[i][j] = li1[i][j] + li2[i][j]
pprint.pprint(result)
10、练习:练习棒球的的分系统
你现在是棒球比赛记录员。
给定一个字符串列表,每个字符串可以是以下四种类型之一:
1.整数(一轮的得分):直接表示您在本轮中获得的积分数。
2. "+"(一轮的得分):表示本轮获得的得分是前两轮有效 回合得分的总和。
3. "D"(一轮的得分):表示本轮获得的得分是前一轮有效 回合得分的两倍。
4. "C"(一个操作,这不是一个回合的分数):表示您获得的最后一个有效 回合的分数是无效的,应该被移除。
每一轮的操作都是永久性的,可能会对前一轮和后一轮产生影响。
你需要返回你在所有回合中得分的总和。
示例 1:
输入: ["5","2","C","D","+"]
输出: 30
解释:
第1轮:你可以得到5分。总和是:5。
第2轮:你可以得到2分。总和是:7。
操作1:第2轮的数据无效。总和是:5。
第3轮:你可以得到10分(第2轮的数据已被删除)。总数是:15。
第4轮:你可以得到5 + 10 = 15分。总数是:30。
示例 2:
输入: ["5","-2","4","C","D","9","+","+"]
输出: 27
解释:
第1轮:你可以得到5分。总和是:5。
第2轮:你可以得到-2分。总数是:3。
第3轮:你可以得到4分。总和是:7。
操作1:第3轮的数据无效。总数是:3。
第4轮:你可以得到-4分(第三轮的数据已被删除)。总和是:-1。
第5轮:你可以得到9分。总数是:8。
第6轮:你可以得到-4 + 9 = 5分。总数是13。
第7轮:你可以得到9 + 5 = 14分。总数是27。
注意:
输入列表的大小将介于1和1000之间。
列表中的每个整数都将介于-30000和30000之间。
# score_list = ["5","2","C","D","+"] score_list = ["5","-2","4","C","D","9","+","+"] result_list = [] def func_(score_list): for i in range(len(score_list)): #遍历列表 try: #try:与if相似,但是try不需要判断语句 result = int(score_list[i]) #若值可转换为int,则为有效分数,其余则是方法 result_list.append(result) print(result_list) except: if score_list[i] == "C": result_list.remove(result_list[-1]) print(result_list) elif score_list[i] == "D": result_list.append(result_list[-1] * 2) print(result_list) elif score_list[i] == "+": result_list.append(result_list[-1] + result_list[-2]) print(result_list) print(sum(result_list)) func_(score_list)
11、列表的内置方法
(1)print(min([2, 1,2,343,545,6]))print(max([2, 1,2,343,545,6]))
print(sum([2, 1,2,343,545,6]))
print(sorted([2, 1,2,343,545,6]))
(2)
for i in reversed([2, 1,2,343,545,6]):
print(i,end=',')print('\n')
(3)
for i in zip([1,2,3], ['a','b', 'c']):
print(i, end=',')
print()
(4) 枚举, 返回列表的索引及对应的元素值;
for i in enumerate(['a', 'b', 'c']):
print(i,end=' ')
12、_is 与 == 的区别
(1)在系统中我们对变量有三个定义
id: 在内存中存储的位置
type: 变量的;类型
value: 值是否相等;
(2)== 判断: type, value
is 判断 :type, value, id
结论:
is表示的是对象标识符;表示两个变量的值是否在同一块内存空间;
==表示的是值是否相等;
总结: is返回值为True, ==返回一定是True;
a = 'hello'
b = 'hello world'
print(a == b)
c = 99999999
d = 99999999
print(c==d)
print(id(c), id(d))
13、深拷贝与浅拷贝
li = [1,2,3,4,5,6]
(1)拷贝:
不是拷贝, 是将li1的指向li的内存位置;
li1 = li
print(li1 is li)
(2)拷贝列表成功
li2 = li[:]
print(li2 is li)
li2.append(5)
print(li)
print(li2)
(3) 浅拷贝
li = [1,,2, 3, [2, 3]]
li3 = li[:]
print(li3 is li)
print(li3[-1][0] is li[-1][0])
li3[-1].append(0)
print(li)
print(li3)
import copy
li = [1, 2, 3, [2, 3]]
li3 = copy.copy(li)
li.append(1)
print(li)
print(li3)
(4)深拷贝
import copy
li = [1, 2, 3, [2, 3]]
li2 = copy.deepcopy(li)
print(li is li2)
li2[-1].append(0)
print(li)
print(li2)