一.列表
1. 列表的创建:
数组: 存储同一数据类型的组合;
列表:可以存储不通类型的数据。
• 定义一个空列表
list = []
• 定义一个包含元素的列表,元素可以是任意类型,包括数值类型,
列表,字符串等均可。
# 定义一个包含元素的列表
l = [1, 2e+8, 2j+9, True, "hello"]
print(l2, type(l2))
2. # 列表里面存储列表
列表里面存储列表:
l2 = [[2,34,2],'hello',2,'linux',32]
print(l2,type(l2))
3. 列表的特性:
列表的特性:
索引, 切片, 重复, 连接, 成员操作符
索引:
l = [1, 2e+8, 2j+9,[1,3,2],True, "hello"]
print(l[0]) #打印第一个元素
print(l[-1]) #打印最后一个元素
print(l[3]) #打印第四个元素
嵌套列表的索引:
l3 = [[1,2,3,4], [5,6,7,8],1, 2e+8, 2j+9, True, "hello"]
print(l3[0][-1])
print(l3[-1][2]) # l3[-1] = "hello" "hello"[2]
强制转换range(5)的返回值为列表 :
强制转换range(5)的返回值为列表 :
l4 = list(range(5))
print(l4[:-1])
print(l4[1:])
print(l4[::-1])
重复:
重复:
l4 = list(range(5))
print(l4*4)
连接:
连接:
l3 = [[1,2,3,4], [5,6,7,8],1, 2e+8, 2j+9, True, "hello"]
l4 = list(range(5))
print(l3+l4)
成员操作符:
成员操作符:
l3 = [[1,2,3,4], [5,6,7,8],1, 2e+8, 2j+9, True, "hello"]
l4 = list(range(5))
print(1 in l4)
print(1 not in l4)
示例:
判断一个单词是否喜欢:
当单词都是大写并且没有两个连续相同的字母是输出喜欢,
否则输出不喜欢。
s = input("string:")
# 1. 单词每个字母都是大写字母
if s.isupper() and isinstance(s,str) and len(s)<100:
# 单词没有连续相等的字母
s_len = len(s)
for index in range(s_len-1):
if s[index] == s[index+1]:
print('Dislikes')
break
else:
print('Likes')
else:
print('Dislikes')
示例:列表练习
假定有下面这样的列表:
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])
4. 列表的增加
languages = ['shell', 'c', 'python']
# # append: 追加, 追加元素到列表的最后;
languages.append('java')
print(languages)
# extend: 追加多个元素到列表中;
other = ['Go', 'perl', 'php']
languages.extend(other)
print(languages)
# # # insert: 添加元素到指定索引的前面;
languages.insert(0, 'C++')
print(languages)
5. 列表的删除
names = ['fentiao','fendai','fensi','apple']
names.remove('fensi') #删除fensi元素
print(names)
names.pop(-1) #弹出最后一个元素
print(names)
查看删除的元素:
reversed_two_intem = names.pop(-2) #将删除的元素赋给变量
print(reversed_two_intem)
del names #删除列表
print(names) #打印会报错
del names[0] #删除列表的第一个元素
print(names)
clear: 清空列表
l = ['shell','c','python','shell','c','c#']
l.clear()
print(l) #打印出是一个空列表
示例:
# 1.删除列表中重复的所有元素
l = ['shell','c','python','shell','c','c#']
new_l = []
# 去掉重复的元素
for i in l:
if i not in new_l and l.count(i) == 1:
new_l.append(i)
print(new_l)
# 2.删除重复的元素:仅删除重复的元素
for i in l:
if i not in new_l:
new_l.append(i)
print(new_l)
执行结果:
示例:
用户登陆系统:
1).已知多个用户名和密码分别保存在列表中;
2).判断用户名是否存在,
如果登陆的用户名不存在,则报错;
如果用户存在,则判断密码是否正确;
如果正确,输出登陆成功;
如果不正确,输出登陆失败;
3).为防止黑客暴力破解密码,登陆最多3次机会;
names = ['root','student'] #用户列表
passwds = ['redhat','student'] #密码列表
for trycount in range(3):
name = input("username:") #用户输入
passwd = input("password:")
#判断用户是否存在?
if name in names:
#判断该用户的密码是否正确:
#1).先找出该用户在列表中的索引
#2).拿出该用户对应的密码
index = names.index(name)
db_pass = passwds[index]
if db_pass == passwd:
print("登陆成功!")
break
else:
print("用户密码错误!")
else:
print("%s用户不存在" %(name))
else:
print("登陆超过三次机会!")
执行结果:
6. 修改列表元素
languages = ['shell', 'c', 'python', 'shell2']
1.通过索引修改列表元素;
languages[0] = 'java'
print(languages)
2.通过切片修改列表元素;
languages[:2] = ['perl', 'matlab']
print(languages)
7.查看
languages = ['shell', 'c', 'python', 'shell', 'a', 'B', 'c']
languages.count('shell')
print(languages.index('shell',1,4))
8.复制
# 该方式不能实现复制, 因为两个变量指向同一块内存空间;
languages = ['shell', 'c', 'python', 'shell', 'a', 'B', 'c']
languages1 = languages
languages.append('PHP')
print(id(languages), id(languages1))
print(languages)
print(languages1)
第一种实现列表的复制;
languages = ['shell', 'c', 'python', 'shell', 'a', 'B', 'c','e']
languages1 = languages.copy()
print(id(languages), id(languages1)) #指向不同的空间
languages.append('Go') #langusges更改langusges1不会更改
print(languages1)
第2种实现列表的复制;
languages = ['shell', 'c', 'python', 'shell', 'a', 'B', 'c','e']
languages1 = languages[:]
print(id(languages), id(languages1))
languages.append('Go')
print(languages1)
9.排序与反转
对于字母的排序:
1.字母按照ASCII码从小到大排序;
languages = ['shell', 'c', 'python', 'shell', 'a', 'B', 'c','e']
languages.sort()
print(languages)
2.字母按照ASCII码从大到小排序;
languages.sort(reverse=True)
print(languages)
反转:
# 直接反转, 类似l[::-1]
languages = ['shell', 'c', 'python', 'shell', 'a', 'B', 'c','e']
languages.reverse()
print(languages)
10.通过列表构建queue队列:先进先出
queue队列工作原理:先进先出
queue队列练习:先进先出
queue = []
max_count = 10
menu = """
队列元素
1).入队
2).出队
3).队头
4).队尾
5).队列长度
6).队列元素
7).队列是否为空
8).队列是否已满:full
请输入你的选择:"""
choice = input(menu)
if choice == '1':
print("入队操作".center(30,'*'))
if len(queue) < 10:
item = input("入队元素:")
queue.append(item)
print("%s入队成功!" %(item))
else:
print("队列已满!")
elif choice == '2':
if not queue:
print("队列为空")
else:
item = queue.pop(0)
print("%s出对成功,队列为:%s" %(item,queue))
elif choice == '3':
if len(queue) == 0:
print("队列为空!")
else:
print("队头为:%s" %(queue[0]))
elif choice == '4':
if len(queue) == 0:
print("队列为空!")
else:
print("队尾为:%s" %(queue[:-1]))
elif choice == '5':
print("队列长度为:%s" %(len(queue)))
elif choice == '6':
for i in queue:
print(i,end=',')
else:
print("错误的选择:%s" %(choice))
11. 通过列表构建栈的数据结构:
栈的工作原理: 先进后出
stack = [1,3,4,]
max_count = 10
menu = """
栈元素
1).入栈
2).出栈
3).栈元素
4).栈顶元素
5).栈长度
6).栈是否为空
请输入你的选择:"""
choice = input(menu)
if choice == '1':
print("入栈操作".center(30,'*'))
if len(stack) < 10:
item = input("入栈元素:")
stack.append(item)
print("%s入栈成功!" %(item))
else:
print("栈已满!")
if choice == '2':
if not stack:
print("栈为空!")
else:
item = stack.pop(0)
print("%s出栈成功,栈为:%s" %(item,stack))
if choice == '3':
if len(stack) == 0:
print("栈为空!")
else:
for i in stack:
print(i,end=',')
if choice == '4':
if len(stack) == 0:
print("栈为空!")
else:
print("栈顶元素为:%s" %(stack[0]))
if choice == '5':
print("栈长度为:%s" %(len(stack)))
if choice == '6':
if len(stack) == 0:
print("栈为空!")
else:
print("栈不为空!")
执行结果:
12. is和==的区别
id: 在内存中存储的位置
type: 变量的;类型
value: 值是否相等;
== 判断: type, value
is: type, value, id
结论:
is表示的是对象标识符;表示两个变量的值是否在同一块内存空间;
==表示的是值是否相等;
总结: is返回值为True, ==返回一定是True;
13. 深拷贝与浅拷贝
>>> import copy #导入模块
深拷贝:
>>> l = [[[2,35,],3,4],3,65,1]
>>> la = copy.deepcopy(l)
>>> id(l[0][0]),id(la[0][0]) #指向不同的内存空间
(140717579268552, 140717588844616)
浅拷贝:
>>> lb = copy.copy(l)
>>> id(l[0][0]),id(lb[0][0]) #指向相同的内存空间
(140717579268552, 140717579268552)
14. 可变数据类型和不可变数据类型
可变数据类型:list是可变数据类型;<有增删改查>列表
不可变数据类型:数值类型, 字符串, bool
二.集合
1.集合的特性:
集合的特性:不支持:(索引, 切片, 重复, 连接,) 因为无序;
支持:成员操作符 for循环。
s = {2,5,8,20}
print(1 in s)
for i in s:
print(i, end=',')
集合是无序的数据类型: 添加元素的顺序和存储的顺序无关;
添加:
s = {2,5,8,20}
s.add(4)
print(s)
2.集合的增删改查
s = {1,2,'d', 3,'c', 'f'}
# 增加单个元素;
s.add(4)
print(s)
# 增加多个元素;
s.update({4, 5, 6})
print(s)
# 删除指定元素
s.remove(1)
print(s)
# 随机删除集合元素
s.pop()
print(s)
# 清空集合
s.clear()
print(s)
3. 集合操作
s1 = {1, 2, 3}
s2 = {1, 2, 4}
1.交集
print(s1.intersection(s2))
print(s1 & s2)
2.并集
print(s1.union(s2))
print(s1 | s2)
3.差集
print(s1.difference(s2))
print(s2.difference(s1))
print(s1 - s2)
print(s2 - s1)
4.对等差分:将两个集合的不同的部分拿出来放一起。
print(s1.symmetric_difference(s2))
print(s1^s2)
s3 = {1,2}
s4 = {1,2,3}
5.s3是s4的子集?
print(s3.issubset(s4))
6.s3是s4的父集?
print(s3.issuperset(s4))
7.s1和s2没有交集么? 如果没有交集True,否则返回False;
print(s3.isdisjoint(s2))
示例1:
1. 共同好友;
你的好友A,B,C 他的好友C,B,D, 求共同好友:
me = {'A','B','C'}
ta = {'C','B','D'}
gongtonghaoyou = me & ta
print(gongtonghaoyou)
2. 微信群提醒:
小明与群里其他人都不是微信朋友关系
#不是朋友关系与任何人都没有交集
执行结果:共同好友为
示例2:
2. 权限判断:
有一个API,要求同时具备A,B,C权限才能访问,目前用户权限为B,C,D,判断该用
户能否访问该API;
# 实质看用户权限是否为ABC的父集:
API = {'A','B','C'}
yonghu = {'B','C','D'}
print(yonghu.issuperset(API))
#用户权限是否是API权限的父集,数出True,可以访问,False不能访问。
示例3:
集合练习:
1.随机产生2组各个数字的列表,每组10个数字,如下要求:
每个数字取值范围[10,20]
#生成随机数:
import random #导入模块(生成随机数)
num1 = []
num2 = []
n = 10
for i in range(n):
item1 = random.randint(10,20)
item2 = random.randint(10,20)
num1.append(item1)
num2.append(item2)
print(num1)
print(num2)
2.统计20个数字中,一共有多少个不同的数字? #求并集
print(len(set(num1) | set(num2)))
3.2组中,不重复的数字有几个?分别是什么? #求对等差分
print(len(set(num1)^set(num2))) #个数
print(set(num1)^set(num2)) #分别是
4.2组中,重复的数字有几个?分别是什么? #求交集
print(len(set(num1)&set(num2)))
print(set(num1)&set(num2))
执行结果:
示例4:
一个总任务列表,储存所有任务,一个完成的任务列表。找出未完成的任务; # 实质上是求差集的。
all_task = ['task1', 'task2', 'task3']
complete = ['task1']
print("未完成任务:%s" %(set(all_task) - set(complete)))
执行结果:
示例5:
# 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,
# 他先用计算机生成了N个1到1000之间的随机整数(N≤1000), N是用户输入的,对于
# 其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应
# 着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺
# 序去找同学做调查。请你协助明明完成“去重”与“排序”的工作;
# 在1-1000之间随机生成10个数字
# 导入随机数模块
import random
# 用户输入的数:
N = int(input('num:'))
# 创建空集合
s = set()
# for循环,生成随机数
for i in range(N):
item = random.randint(1,1000)
s.add(item)
# 对于集合进行排序
print(sorted(s))