又开始的python-day03-20200718-列表-深浅拷贝-元组-字典

# 当我们有多个数据保存 有序可变 可修改
# 列表的格式
# 使用 [] s来表示一个列表  列表的每一个数据称之为元素
# 元素之间使用逗号分割
# names = ['zss','jack','chenglong']
# list 可以将可迭代对象转换成列表
names = list(('zss','jack','chenglong'))
print(names)
#可以用下标获取
print(names[2])
names[2]='shy'
print(names)
print(names[1:2]) #下标切片



# 列表的操作
# 增删改查
heros = ['阿轲','嬴政','韩信','露娜','后羿','亚瑟']
# 添加元素 append insert extend
heros.append('猴子')
print(heros) #append 在列表最后面追加一个数据
# insert(index,object) 需要2个参数
# index 表示下标 在那个位置插入数据
# object 表示对象,具体插入那个数据
heros.insert(3,'李白')
print(heros)
#a.extend(b) 将b添加到a
x = ['特玛西亚','猫咪']
heros.extend(x)
print(heros)

# 删除数据 pop remove clear
# pop 方法默认删除列表的最后一个数据 并返回这个数据
masters = ['妲己','小乔','大乔']
x = masters.pop(1)
print(x)
print(masters)
# remove 删除指定的元素 如果数据不存在会报错
masters.remove('大乔')
print(masters)
# del 也可以删除 少用 或者不用 有别的用处
del masters[0]
print(masters)
# clear 用来清空一个列表
masters.clear()
print(masters)

tanks = ['猴子','德玛','天使','张飞','程咬金','猴子']
# 修改元素 下标可以直接修改
tanks[1] = '凯'
print(tanks)

# 查询相关的方法
print(tanks.index('天使')) # 2  下标
print(tanks.count('猴子')) # 2  统计次数
#in 运算符
print('天使' in tanks) #True
print('薇恩' in tanks) #False


# 遍历 将所有数据都访问一遍
# whiles / for ..in 
killers = ['李白','兰陵王','韩信','赵云','阿轲','孙悟空']
for i in killers: # 本质是不断调用迭代器的next的方法查找下一个数据
	print(i)

i=0
while i < len(killers):
	print(killers[i])
	i += 1

# 两个变量的交换
# 用第三个变量
a = 2
b = 3
# c = b
# b = a
# a = c
# 使用异或运算符 a ^ a ^ b = b
# a = a ^ b
# b = a ^ b
# a = a ^ b
# python 独有的 
a,b = b,a
print(a)
print(b)

# 冒泡排序
nums = [6,5,3,1,8,7,2,4]
# 0 1
# 1 2
# len(nums)-2 len(nums)-1
# 0 1 2 3 4 5 6 7
# 比较次数的优化
# print(len(nums))
# n=0
# while n < len(nums):
	# i=0
	# while i < len(nums) -1:
		# if nums[i] > nums[i+1]:
			# nums[i],nums[i+1] = nums[i+1],nums[i]
		# i += 1
	# n += 1
# print(nums)
# P81
# 调用列表的sort方法 可以直接对列表进行排序
# nums.sort() #排序
# nums.sort(reverse=True) #倒序
# print(nums)
# 内置函数 sorted 也是排序 不会改变原来的数据
print(sorted(nums))
names = ['zss','shy','love']
names.reverse() #reverse 列表的反转
print(names)



#列表的复制
# 可变类型 和 不可变类型’
# 不可变类型 如果修改值 内存地址会发生变化
# 可变类型 如果修改值 内存地址不会发生变化
x = [100,200,300]
y = x
# 调用copy 方法 复制一个列表 虽然内容一样 但却指向了不同的内存空间
z = x.copy()
x[0] = 1
print(y) # y 受 x 的影响 x 变化了 y 也会变化
print(z) # z 不受x 的影响
#  除了列表自带的copy方法外 还可以使用 copy模块实现拷贝
import copy
a = copy.copy(x) # 效果等价于x.copy() 都是浅拷贝
# 还有个是深拷贝

# 切片其实就是浅拷贝
x = [100,200,300]
y = x[::]
x[0] = 1
print(y)


#冒泡排序优化
# 第一趟比较 多比较了1次
# 第二趟比较 多比较了2次
# 
n=0
count=0
while n < len(nums):
	i=0
	flag = True #假设每一趟比较都没换行
	while i < len(nums) -1 - n: #优化了21次
		count += 1
		if nums[i] > nums[i+1]:
			nums[i],nums[i+1] = nums[i+1],nums[i]
			flag = False #交换了 假设就不成立
		i += 1
	if flag:
		break #没有数据交换 就不用比较了
	n += 1
print(nums)
print(count)

#求列表里的最大数
nums = [3,23,4,667,8,9,0,234,123,123,45,23]
nums.sort()
print(nums[-1])

x = nums[0]
for num in nums:
	if num > x:
		x = num
print(x) #最大值
print(nums.index(x)) #求最大值的下标

# 删除列表的空字符串
x = ['','','','','','','zss','shy']
# 在使用for..in 循环遍历列表的时候 最好不要对元素进行增删操作
# 保险点 把不是空的追加到新的表
x2 = []
for word in x:
	if word != '':
		x2.append(word)
print(x2)

#列表的嵌套
import random
nums = [1,2,3,[100,233,2222],222] #在别的语言叫做多维数组
# 一个学校 有3个办公室 现在有8位老师 等待工位的分配 请编写程序 完成随机分配
teachers = ['a','b','c','d','e','f','g','h','i','j']
rooms = [[],[],[]]
for teacher in teachers:
	room = random.choice(rooms) # choice 从列表里随机选一个数据
	room.append(teacher)
print(rooms)

# 第0个房间有3个人
# 带下标的一般用while 其实for 也可以
for i,room in enumerate(rooms):
	print('房间%d里一共有%d个老师,分别是:' % (i,len(room)),end='')
	for teacher in room:
		print(teacher,end=' ')
	print()
	
# 列表推导式
# 使用简单的语法创建一个列表
nums = [i for i in range(10)]
print(nums)
nums = [i for i in range(10) if i % 2 == 0]
print(nums) # 偶数
nums = [i for i in range(10) if i % 2 ] # 布尔值 余数 0 False 1 True
print(nums) # 奇数
x = []
for i in range(10):
	if i % 2:
		x.append(i)
points = [(x,y) for x in range(5,9) for y in range(10,20)]
print(points)
# 用一段代码实现分组一个list的元素 [1,2,3,4,....100] 变为 [[1,2,3],[4,5,6]...]
lis = [x for x in range(1,101)]
n = [lis[j:j+3] for j in range(0,100,3)]
print(n)

# 深拷贝和浅拷贝
nums = [1,2,3,4,5]
num1 = nums # 这是赋值 不是深拷贝 也不是浅拷贝
num2 = nums.copy() # 浅拷贝 两个内容一样 但不是同一个对象
num3 = copy.copy(nums) # 和 nums.copy() 功能一样 都是浅拷贝

# 深拷贝 只能使用copy模块实现
import copy
words = ['hello','good',[100,200],'yes','hi','ok']
words1 = words.copy() #浅拷贝 只拷贝了一层 如果列表里面还有列表 它只复制了里面列表的表面 深层指向其本质
words2 = copy.deepcopy(words) #深拷贝 复制了全部 且 独立存在 互不影响
words[1] = 'zss'
print(words1) # 没变化
words[2][0] = 1
print(words1) # 改变了 里面的列表
print(words2)
words2[2][0] = 2
print(words2)


# 元组的使用
# 和列表很像 都是用来保存数据的
# 使用一对小括号() 来表示一个元组
# 二者区别在于 列表是可变的 元组是不可变的
words = ['hello','yes','good'] # 列表 []
nums = (1,23,5,6,7,8,2,5,6,7,8,98,7,6) # 元组 使用()表示
# 和列表一样 也是一个有序的存储数据的容器 可以通过下标获取元素 但不可更改
print(nums[3]) # 下标是3的元素
print(nums.index(5)) # 获取5的下标
print(nums.count(6)) # 获取元素6出现的次数
# 特殊情况 表示一个只有一个元素的元组
ages = (18,)
print(ages)
# 内置类 tuple
print(tuple('hello')) # ('h', 'e', 'l', 'l', 'o')

# 列表和元组互相转换
print(tuple(words)) # tuple list set 都是这样使用的 列表转元组
print(list(nums)) # 元组转列表
heights = ("189","174","170") # join 里面必须是字符串
print('*'.join(heights)) # 189*174*170
print(''.join(('z','s','s'))) # zss

# 元组也可以遍历
for i in nums:
	print(i)
	
i = 0
while i < len(nums):
	print(nums[i])
	i += 1
	
	

# 字典的使用
# 列表[] 可修改 元组()不可修改
# 列表可以存储任意数据类型 但一般都存储单一数据类型
# 列表 可以存储值  但元素值代表什么 没去定义 而字典就可以解决
# 字典不仅保存值 还可以进行描述
# {}  表示一个字典 值 value 描述 key
# {key1:value1,key2:value2,....} 键值对之间以,分开
person = {'name':'zss','age':24,'x':'y','addr':'SZ','pass':True,'love':['唱','跳','rap'],4:'good',('yes','no'):100}
# 字典的注意事项
# 字典里的key不允许重复 如果重复了 后一个key值会覆盖前一个
# 字典里的value可以是任意数据类型 但是key只能使用不可变数据类型 字符串 数字 元组 ,一般使用字符串
print(person)

# 字典的增删改查
# 查找数据(字典的数据是无序的,不能通过下标查询)
print(person['name']) # 使用key获取到对应的value  而不能用value 找key 因为value不是唯一的
x = 'age'
print(person[x]) #  24
print(person['x']) # y
# print(person['xx']) # key不存在会直接报错
# 需求 如果key不存在 不报错 使用默认值
# 字典的get方法
print(person.get('xx')) # key不存在 不报错返回None
print(person.get('xx','zsss')) # key不存在 不报错 返回使用给定的默认值 zsss
print(person.get('name','haha')) # key 存在 就返回key对应的值
print(person) # get的方法 并不会改动原字典
# 修改数据 新增数据
person['name'] = 'haha' # 修改key值对应的value值
print(person)
person['gender'] = 'pople' # 如果key值不存在 就直接添加进去
print(person)
# 删除数据 pop popitem clear
person.pop('name')
print(person)
result = person.popitem()
print(result) # 得到被删除的键值对
print(person)
del person['addr'] # 运算符 del 删除一个
print(person)
person.clear() # 清空字典
print(person)

# update 方法的使用
# 列表可以使用extend方法 将两个列表合并成一个列表
nums = [1,2]
nums1 = [3,4]
nums.extend(nums1)
print(nums)
print(nums + nums1) # 也可以用运算 +

# 元组
word = (1,23)
wod1 = (33,222)
print(word + wod1) # 可以用运算 + 而没有方法去直接合并

# 字典 可以使用 update 方法 合并2个字典
person1 = {'name':'zss','age':24}
person2 = {'addr':'SZ','phone':888}
person1.update(person2)
print(person1)
# print(person1 + person2) # 字典之间不支持加法运算
# P98

# 字典的遍历
person = {'name':'zss','age':24}
# 特殊在列表和元组都是单一的数据 而字典是键值对的形式
# 第一种方法 for...in  循环
for x in person: # 循环获取的是key值
	print(x,'=',person[x])
# 第二种 获取所有的key 然后再遍历key 再根据key获取value
for k in person.keys():
	print(k,'=',person[k])	
# 第三种 获取到所有的value
for v in person.values():
	print(v)
# 第四种
for item in person.items():
	print(item[0],'=',item[1])
for k,v in person.items(): #dict_items([('name', 'zss'), ('age', 24)])
	print(k,'=',v)
	

# 字典的练习
chars = ['a','c','s','s','a','g','w','a','t','t'] #统计字母出现次数
char_count = {} #用字典去存储数据
for char in chars:
	if char in char_count:
		#在里面
		char_count[char] += 1
	else:
		#不在里面
		char_count[char] = 1
print(char_count)
# 下面这个方法更好一点
char_count = {} #用字典去存储数据
for char in chars:
	if char not in char_count:
		char_count[char] = chars.count(char)
print(char_count)
# 取出出现次数最多的字母
# 内置函数 max() 取最大值
for k,v in char_count.items():
	if v == max(char_count.values()):
		print(k)
	
# 让用户输入用户 如果姓名存在 提示用户 如果不存在 继续输入年龄 并存入列表
# {} 字典 [] 元组
persons = [{'name':'zss','age':24},{'name':'jack','age':22}]
# name = input("请输入你的姓名:")
# for i in persons:
	# if i['name'] == name:
		# # 用户存在
		# print('用户存在')
		# break
# else: # for...else....
	# # 用户不存在 继续输入年龄
	# new_dic = {}
	# new_dic['name'] = name
	# age = int(input("请输入你的年龄:")) #整数类型
	# # 把年龄和姓名组成一个字典
	# new_dic['age'] = age
	# # 再把字典加入到列表内
	# persons.append(new_dic)
	# print('用户添加成功')
# print(persons)

# 字典对应数据换位置
dict1 = {"a":100,"b":200,"c":300}
# {100: 'a', 200: 'b', 300: 'c'}
dict2 = {}
for k,v in dict1.items():
	dict2[v] = k
print(dict2)
# 字典推导式
dict1 = {v:k for k,v in dict1.items()}
print(dict1)

你可能感兴趣的:(Python)