列表补充

补充方法

  清空列表 clear

# clear  清空列表
l = [1, 2, 3, 4, 4]
print(l.clear()) # clear没有返回值(None)
print(l)
# None
# []

  统计列表中指定元素出现的次数 count

# count 统计一个元素在列表中出现了几次
l = [1, 2, 3, 4, 4]
print(l.count(4))
#

  列表反向、排序   reverse   sort(带参数,可指定按正序/ 反序排)

# reverse 将列表翻转
l = [1, 2, 3, 4, 4, 2]
print(l.reverse()) # reverse没有返回值(None)
print(l)
# None
# [2, 4, 4, 3, 2, 1] # sort 排序,默认从小到大排序
l = [1, 2, 3, 4, 4, 2]
print(l.sort()) # sort没有返回值(None)
print(l)
# None
# [1, 2, 2, 3, 4, 4] l = [1, 2, 3, 4, 4, 2]
print(l.sort(reverse=True)) # sort可以指定参数来确定排序规则
print(l)
# None
# [4, 4, 3, 2, 2, 1] l = list('dasb41564s5.*/-^&#$84')
print(l.sort()) # sort方法排序字符时按ASCII码排序
print(l)
# None
# ['#', '$', '&', '*', '-', '.', '/', '1', '4', '4', '4', '5', '5', '6', '8', '^', 'a', 'b', 'd', 's', 's']

  总结

# ------- 列表总结 ---------
# 能存多个值
# 有序的
# 可变类型
# 队列:先进先出  (排队)
# 堆栈:先进后出 (叠书、叠衣服 拿出来)

元组

简介

# 作用:能存储多个元素
# 定义:与列表一致,只不过把 [] 变成了 ()
# 特点:
#   能存多个值
#   有序(能用索引取值)
#   不可变:不可以修改元素的值,不可以增加元素个数,删除元素个数
# 只能看不能改的场景,推荐用元组
# 存相同的数据,元组比列表占用的资源会更少(列表多出来的那堆方法也会占很多空间)

内置方法

  定义元组

t = (1, 2, 3, 4)  # tuple((1, 2, 3, 4))
print(type(t))
# <class 'tuple'> t = tuple(1) # 报错,内部基于for循环,必须传容器类型
print(type(t)) # 定义元组时如果只有一个元素,也得加上 , 逗号 不然会被python 解释成 其他类型
t = (1)
print(type(t))
# <class 'int'> t = (1, )
print(type(t))
# <class 'tuple'> t = ('a')
print(type(t))
# <class 'str'> t = ('a', )
print(type(t))
# <class 'tuple'>

  验证是否可变类型  --->不可变类型

t2 = (1, 2, 3, [1, 2, 3])
print(id(t2))
#
t2[3][0] = 666666
print(t2)
print(id(t2))
# (1, 2, 3, [666666, 2, 3]) # 注意这里改的是元组内部的列表的值,不是在改动元组(元组的第四个元素(索引为3),存的是个内存地址)
#
# ---> 内存地址不变,所以他是不可变类型

  索引取值

# 索引取值  可取不可改
t = (2, 3, 4)
print(t[0]) # t[0] = 4 # 会直接报错,TypeError: 'tuple' object does not support item assignment 元组的元素不可以改(如果元素是可变类型,那么可以改) t = (2, 3, 4, [5, 6, 7])
t[3][0] = '我改了' # 不报错,因为改的是列表(具体看原理图(内存指向,实际元组没有改动))
print(t)
# (2, 3, 4, ['我改了', 6, 7])

  切片

# 切片 与列表字符串的用法一致,这里就不过多举例了
t = (1, 3, 5, 8, 10)
print(t[-1:-5:-1])
# (10, 8, 5, 3)

  元组中的元素个数 len

# 元组中的元素个数 len
t = (1, 3, 5, 8, 10)
print(len(t))
#

  成员运算 in / not in

# 成员运算 in / not in
t = (1, 3, 5, 8, 10)
print(3 in t)
print(3 not in t)
print(13 in t)
print(13 not in t)
# True
# False
# False
# True

  作为循环的迭代器对象 for in

# 作为循环的迭代器对象 for in
t = (1, 3, 5, 8, 10)
for i in t:
print(i, end=' ')
# 1 3 5 8 10

  统计某个元素在元组中出现的次数 count

# count 统计某个元素在元组中出现的次数
t = ('hello', 'thank', 'you', 1, 1.1, ['hello', 3, 'thank'], 'thank', 'you', 'very', 'much')
print(type(t))
print(t.count('hello')) # 元素内部不管,只管第一层
print(t.count('thank'))
# <class 'tuple'>
#
#

  获取元素的索引  index (找不到会报错)

# index 获取元素的索引(试试字符串类型的?)
print(t.index('thank'))
#
# print(t.index('your')) # 找不到值会报错 ValueError: tuple.index(x): x not in tuple
# 可以用count 判断在不在里面(为0 则不在里面,为其他值则在),再用index 找该元素的索引

字典

简介

# 能存储多组 key: value 这样的键值对,可存可取
# key是对value的描述,并且key 通常情况下都是字符串,其实这个key 只能是不可变类型,value可以是任意数据类型
# 字典的key 是唯一性标识,同一个字典中key 不能重复
# 如果重复了,只会按照最后一组键值对存储(即覆盖了前一组同名的 key)
#
# 字典是无序的,它是按 key 取值,不是索引
# 字典是可变类型:键值对发生改变,字典的内存地址不会改变
#   数字类型(int、float),字符串,元组 都可以作为字典的 key

内置函数

  定义字典

d = {'name': 'jason', 'password': 123}  # d = dict({'name': 'jason', 'password': 123})
d1 = {1: '', 0: '', 1.1: '1.1', 'string': 'string', (1, 2): '到底行不行呢?'}
print(d1)
print(type(d1))
# {1: '1', 0: '0', 1.1: '1.1', 'string': 'string', (1, 2): '到底行不行呢?'}
# <class 'dict'> # 没错,它也是一个合法的字典类型
print(d1[1])
print(d1[1.1])
print(d1['string'])
print(d1[(1, 2)])
#
# 1.1
# string
# 到底行不行呢? # 定义字典的三种方式
# 1 直接定义
d1 = {'name': 'jason', 'password': ''} # 2 ----> 通过关键字传参来定义 ***重点掌握(后期面向对象的时候好用)***
d2 = dict(name='jason', password=123, age=18) # 3 直接dict 类型转换
l = [
['name', 'jason'],
['age', 18],
['hobby', 'read']
]
# 简便写法
d3 = {}
d3 = dict(l)
print(d3)
# {'name': 'jason', 'age': 18, 'hobby': 'read'} # 上面写法的原理
d3 = {}
for k, v in l: # ['name', 'jason'],['age', 18]....
# 这里的 k,v 利用了解压赋值
d3[k] = v
print(d3)
# {'name': 'jason', 'age': 18, 'hobby': 'read'}

  创建字典的其他方式    fromkeys   (不怎么好用)

# fromkeys() 用来创造字典
d1 = {'name': 'jaoon', 'password': '', 'sex': 'gender', 'salary': 16000}
print(d1.fromkeys('name'))
# {'n': None, 'a': None, 'm': None, 'e': None} # 扩展用法
l = ['name', 'password', 'age', 'hobby']
dic = {}
print(dic.fromkeys(l, 123)) # 快速创建字典,后续再去更改
# {'name': 123, 'password': 123, 'age': 123, 'hobby': 123} dic = {}
l = ['name', 'password', 'age', 'hobby']
l2 = ["swb", 18, ["study", "cooking"]]
print(dic.fromkeys(l, l2))
print(dic)
# {'name': ['swb', 18, ['study', 'cooking']], 'password': ['swb', 18, ['study', 'cooking']], 'age': ['swb', 18, ['study', 'cooking']], 'hobby': ['swb', 18, ['study', 'cooking']]}
# {}

  给字典中的指定键值对指定默认值  setdefault

# setdefault()
d1 = {'name': 'jaoon', 'password': ''}
print(d1.setdefault('name', 'xxoo')) # 当键存在的情况下会返回该键的值,并且不会改变该键的值
print(d1)
print(d1.setdefault('age', 18)) # 当键不存在的情况下会给字典添加一个键值对(两个参数),并且会把新增的键值对的值返回
print(d1)
# jaoon
# {'name': 'jaoon', 'password': '123'}
#
# {'name': 'jaoon', 'password': '123', 'age': 18}

  更新字典的值:1.字典的 update 方法,2.直接通过 不存在的key 赋值的方式添加键值对(具体看下方例子)

# 1.update()
# 1.1
d1 = {'name': 'jaoon', 'password': ''}
d2 = {'age': 18}
print(d1.update(d2))
print(d1)
# None
# {'name': 'jaoon', 'password': '123', 'age': 18} # 1.2
d1 = {'name': 'jaoon', 'password': ''}
print(d1.update(age=18))
print(d1)
# None
# {'name': 'jaoon', 'password': '123', 'age': 18} # 2 推荐直接这样写 -----------> !!!! 上面写法太麻烦,不如这个好用
d1 = {'name': 'jaoon', 'password': ''}
print(d1)
d1['age'] = 18
print(d1)
# {'name': 'jaoon', 'password': '123'}
# {'name': 'jaoon', 'password': '123', 'age': 18}

  获取字符串中键值对个数   len

dit2 = {'name': 'egon', 'name': 'jason', 'name': 'alex', 'age': 18}
print(dit2)
print(len(dit2))
# {'name': 'alex', 'age': 18} # 重复的键会覆盖前面的键
#

  成员运算 in / not in (只能取到key 值)

# 成员运算 in/ not in  字典在for循环只暴露出 key, value无法取到,不能做成员运算
d3 = {'name': 'jaoon', 'password': ''}
print('' in d3)
print('password' in d3)
# False
# True

  按key 取值 (类似列表中的索引取值  ---> 字典是无序的,字典中没有索引取值)

# 按key 存取值:可存可取
d3 = {'name': 'jaoon', 'password': ''}
print(id(d3))
#
print(d3['name'])
# jaoon
d3['name'] = 'egon' # 改的是指向,不是索引, 字典是无序的, key 重复了是替换的意思 d3['age'] = 18 # 赋值语句当key 不存在的情况下,会自动新增一个键值对
print(d3, id(d3))
# {'name': 'egon', 'password': '123', 'age': 18} 2364215340992

  取值的其他方法    keys   values   items   get

# 获取字典value的方法 ----》 keys values items 在 python2.x 产生的是列表,而 python3.x 是生成器对象
# 1. 粗暴的循环获取(通过key ) # 字典的 keys() values() items() 方法在 python 2.x 和 3.x 中有区别,像老母猪
# 2. keys()
d1 = {'name': 'jaoon', 'password': '', 'sex': 'gender', 'salary': 16000}
print(d1.keys())
# dict_keys(['name', 'password', 'sex', 'salary']) ,像老母猪
for k in d1.keys():
print(k)
# name
# password
# sex
# salary # 3. values() 与上面类似
d1 = {'name': 'jaoon', 'password': '', 'sex': 'gender', 'salary': 16000}
print(d1.values())
# dict_values(['jaoon', '123', 'gender', 16000])
for i in d1.values():
print(i)
# jaoon
#
# gender
# # 4. items() 列表套元组,元组的第一个元素是字典的key , 第二个元素是字典的value
d1 = {'name': 'jaoon', 'password': '', 'sex': 'gender', 'salary': 16000}
print(d1.items())
# dict_items([('name', 'jaoon'), ('password', '123'), ('sex', 'gender'), ('salary', 16000)])
for i in d1.items():
print(i)
# ('name', 'jaoon')
# ('password', '123')
# ('sex', 'gender')
# ('salary', 16000) # 作为迭代器对象循环取值
# for i in ... # get() 根据key 获取 value, 可以传第二个参数,当传入的key 不存在,会返回(提示信息)该参数, 存在则会返回该key 对应的值, 第二个参数不写的话,key 不存在会返回None ,如果存在则会返回该key 对应的value
# 推荐字典取值统一用 get **********
d1 = {'name': 'jaoon', 'password': '', 'sex': 'gender', 'salary': 16000}
print(d1.get('name'))
# jaoon
print(d1.get('hahah')) # 当key 不存在时不会报错,返回None, 用 []取不存在的会直接报错
# None
print(d1.get('name', '你给我的name 不在字典的key 中'))
print(d1.get('hahah', '你给我的hahah 不在字典的key 中'))
# jaoon
# 你给我的hahah 不在字典的key 中

  删除字典中的键值对或清空字典   del      pop     popitem     clear

# 删除
# del
d3 = {'name': 'jaoon', 'password': ''}
del d3['name']
print(d3)
# {'password': '123'} # pop 传key, key 不存在会直接报错
d3 = {'name': 'jaoon', 'password': ''}
print(d3.pop('name')) # pop 返回的是value
print(d3)
# jaoon
# {'password': '123'}
# print(d3.pop('age')) # 当键不存在的时候,直接报错,KeyError: 'age' # popitem 不需要参数,弹出"最后"一个键值对(字典是无序的,不存在什么第几个、最后一个)
d3 = {'name': 'jaoon', 'password': ''}
print(d3.popitem())
print(d3)
# ('password', '123')
# {'name': 'jaoon'}
print(d3.popitem())
# ('name', 'jaoon')
# print(d3.popitem()) # 会报错,弹空了 # clear 清空字典
d3 = {'name': 'jaoon', 'password': ''}
print(d3.clear())
print(d3)
# None
# {}

集合

简介

# 群体之间作比较,不涉及单个元素 --> 推荐用集合  (见关系图,整理到博客里去)
# 作用: 做关系运算: 共同好友、共同粉丝 ---> 涉及到共同,两个群体之间作比较
# 去重,把重复元素剔除掉
# 可以定义多个元素,元素之间用逗号分隔
# 集合的元素必须遵循的三个原则
# 1:每个元素必须是不可变类型(元素值改变后,内存地址是否会随之改变)
# 可变: 不可hash
# 不可变: 可hash
'''
d = {[1, 2]: 'name'} # 会报错,不可hash,并且元素之间 , 间隔 TypeError: unhashable type: 'list'
s = {1, 2, 1.1, 'string', (1, 2)}
print('-----------', s)
# ----------- {(1, 2), 1, 2, 1.1, 'string'}
'''
# 2:没有重复的元素
'''
s = {1, 2, 3, 3, 4, 3} # 自动将重复的元素去除
print(s)
# {1, 2, 3, 4} 将其他类型去重成集合,再想办法转回去
l = ['jason', 'egon', 'jason']
s = set()
print(s.update(l))
print(s)
# None
# {'egon', 'jason'}
'''
# 3:无序
'''
s = {1, 2, 3, 4, 5}
print(s[1]) # 会直接报错,集合不支持索引取值 TypeError: 'set' object does not support indexing
'''

内置函数

  定义集合

# 定义集合  (跟字典很像,但它内部不是键值对)
s = {1, 2, 3} # s = set({1, 2, 3})
print(type(s))
# <class 'set'> # 尝试定义空集合
s = {} # 如果仅仅只写了 {} .那么python 会默认把它当成字典类型
print(type(s))
# <class 'dict'> # 定义空集合 只能用关键字 set
s = set()
print(type(s))
# <class 'set'> # 定义空元组 就是本身的元组
t = ()
print(type(t))
# <class 'tuple'> # print(set(1)) # 会报错,set也是迭代对象 TypeError: 'int' object is not iterable
print(set((1,)))
# {1}

  向集合中添加元素  add

# 集合添加元素
# add
s = {1, 2, 3, 4, 5}
print(s.add(666))
print(s)
print(s.add((1, 2, 3, 4)))
print(s)
# None
# {1, 2, 3, 4, 5, 666}
# None
# {1, 2, 3, 4, 5, (1, 2, 3, 4), 666} # 集合是无序的

  获取集合元素个数  len

# len 长度
s = {1, 2, 3, 4, 5}
print(len(s))
#

  集合在交集并集关系处理中的运用    &  |  ^   -   <  <=  >  >=  ==  以及他们的英语方法写法(后续补充一下)

# 交集并集等集合关系的运用
pythons = ['jason', 'nick', 'tank', 'egon', 'kevin', 'owen', 'alex']
linux = ['frank', 'jerry', 'tank', 'egon', 'alex'] # 求既在python 又在linux 的同学
# 普通循环写法
for name in pythons:
if name in linux:
print(name)
# tank
# egon
# alex
pythons = {'jason', 'nick', 'tank', 'egon', 'kevin', 'owen', 'alex'}
linux = {'frank', 'jerry', 'tank', 'egon', 'alex'} # & 交集
# pythons 和 linux中都有的
print(pythons & linux)
# {'tank', 'alex', 'egon'} # - 差集 -----------------
# 只在 pythons 中的
print(pythons - linux)
# {'kevin', 'nick', 'jason', 'owen'} # 只在 linux 中的
print(linux - pythons)
# {'frank', 'jerry'} # ^ 对称差集
# 没有同时在 pythons 和 linux 中的
print(pythons ^ linux)
# {'kevin', 'nick', 'jerry', 'owen', 'jason', 'frank'} # | 合集
# pythons 和 linux 所有的元素(不重复)
print(pythons | linux)
# {'kevin', 'frank', 'alex', 'egon', 'jason', 'tank', 'jerry', 'nick', 'owen'} # == 判断两个集合是否相等
print(pythons == linux)
# False # 父级子级
s = {1, 2, 3, 4}
s2 = {2, 4} # > >= 是否包含 (父级) issuperset
print(s >= s2)
# True # < <= 是否被包含 (子级) issubset
# 父级自己反过来一样的

  删除集合中的元素    pop    remove    clear    discard    通用del

# pop 会返回删除元素的值(集合是无序的---虽然看起来存进去的元素都是从小到大排序,但它不能索引取值,没有参数)
my_set = {2, 15, 13, 1}
print(my_set.pop())
print(my_set.pop())
print(my_set)
#
#
# {13, 15} # remove 删除指定元素,没有返回值,指定元素若不存在会报错
my_set = {2, 15, 13, 1}
print(my_set.remove(13))
print(my_set)
# None
# {1, 2, 15}
# print(my_set.remove(22)) # 元素不存在,直接报错 # discard 删除指定元素,没有返回值,指定元素不存在不报错
my_set = {2, 15, 13, 1}
print(my_set.discard(13))
print(my_set)
print(my_set.discard(22))
print(my_set)
# None
# {1, 2, 15}
# None
# {1, 2, 15} # clear
my_set = {2, 15, 13, 1}
print(my_set)
print(my_set.clear())
print(my_set)
# {1, 2, 13, 15}
# None
# set() # del 通用删除大法
my_set = {2, 15, 13, 1}
del my_set
# print(my_set) # 直接报错,引用被删除了

补充知识点

enumerate() : # enumerate枚举:给可迭代对象(列表、字典)等类型添加序号

good_list = [
['mac', 555],
['apple', 333]
] for index, good in enumerate(good_list):
print(index, good)
# 0 ['mac', 555]
# 1 ['apple', 333]

区分类型

# 必须分清楚下面这几种类型分别长啥样!!!别写混了
# 列表 list
# [1, 2, 3, 4]
# 元组 tuple
# (1, 2, 3, 4)
# 集合 set
# {1, 2, 3, 4}

个人扩展案例及练习

# 处理省份之间突然有格式不对的东西(本来 、 隔开的,后来有些地方用 , , 隔开)
# 目标数据格式:{'市名': ['各个市'], '市名': ['各个市']}
# 南充市:顺庆区、高坪区、嘉陵区、阆中市、南部县、营山县、蓬安县、仪陇县、西充县
# 宜宾市:翠屏区、宜宾县,南溪县、江安县、长宁县、高县、珙县、筠连县、兴文县、屏山县
# 广安市:广安区、华蓥市、岳池县、武胜县,邻水县
region_info = '''南充市:顺庆区、高坪区、嘉陵区、阆中市、南部县、营山县、蓬安县、仪陇县、西充县
宜宾市:翠屏区、宜宾县,南溪县、江安县、长宁县、高县、珙县、筠连县、兴文县、屏山县
广安市:广安区,华蓥市,岳池县、武胜县,邻水县'''
print(region_info)
raw_infos = region_info.split('\n')
print(raw_infos)
dic = {}
for raw_info in raw_infos:
key, value = raw_info.split(':')
dic[key] = value
print(dic)
for key, value in dic.items():
r_value = value.replace(',', '、')
target_value = r_value.replace(',', '、')
print(target_value)
item = target_value.split('、')
dic[key] = item
# 南充市:顺庆区、高坪区、嘉陵区、阆中市、南部县、营山县、蓬安县、仪陇县、西充县
# 宜宾市:翠屏区、宜宾县,南溪县、江安县、长宁县、高县、珙县、筠连县、兴文县、屏山县
# 广安市:广安区,华蓥市,岳池县、武胜县,邻水县
# ['南充市:顺庆区、高坪区、嘉陵区、阆中市、南部县、营山县、蓬安县、仪陇县、西充县', '宜宾市:翠屏区、宜宾县,南溪县、江安县、长宁县、高县、珙县、筠连县、兴文县、屏山县', '广安市:广安区,华蓥市,岳池县、武胜县,邻水县']
# {'南充市': '顺庆区、高坪区、嘉陵区、阆中市、南部县、营山县、蓬安县、仪陇县、西充县', '宜宾市': '翠屏区、宜宾县,南溪县、江安县、长宁县、高县、珙县、筠连县、兴文县、屏山县', '广安市': '广安区,华蓥市,岳池县、武胜县,邻水县'}
# 顺庆区、高坪区、嘉陵区、阆中市、南部县、营山县、蓬安县、仪陇县、西充县
# 翠屏区、宜宾县、南溪县、江安县、长宁县、高县、珙县、筠连县、兴文县、屏山县
# 广安区、华蓥市、岳池县、武胜县、邻水县
print(dic)
# {'南充市': ['顺庆区', '高坪区', '嘉陵区', '阆中市', '南部县', '营山县', '蓬安县', '仪陇县', '西充县'], '宜宾市': ['翠屏区', '宜宾县', '南溪县', '江安县', '长宁县', '高县', '珙县', '筠连县', '兴文县', '屏山县'], '广安市': ['广安区', '华蓥市', '岳池县', '武胜县', '邻水县']}

实现代码

'''
1.有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中
即: {'k1': 大于66的所有值, 'k2': 小于66的所有值}
小提示:按照题意这里的k1和k2对应的value必须能存多个值
'''
s = {11, 22, 33, 44, 55, 66, 77, 88, 99, 90}
d = {'k1': [], 'k2': []}
for value in s:
if value >= 66:
d['k1'].append(value)
else:
d['k2'].append(value)
print(d)
# {'k1': [66, 99, 77, 88, 90], 'k2': [33, 11, 44, 22, 55]}

实现代码

# 2.简单购物车,要求如下:
# 实现打印商品详细信息,用户输入商品名和购买个数,则将商品名,价格,购买个数加入购物列表,如果输入为空或其他非法输入则要求用户重新输入  
# msg_dic={
# 'apple':10,
# 'tesla':100000,
# 'mac':3000,
# 'lenovo':30000,
# 'chicken':10,
# }
# 小提示:打印的时候即需要拿到字典的key也需要拿到对应的value
# 逻辑还是有点混乱(Q/ y 输错了直接就重新购买商品了。。。)
msg_dic = {
'apple': 10,
'tesla': 100000,
'mac': 3000,
'lenovo': 30000,
'chicken': 10,
}
shop_name = ""
shop_count = ""
choice = ""
shop_car = []
total_price = 0
while True:
print("欢迎光临 online 商城".center(40, '-'))
print("本店商品信息如下,欢迎抢购".center(35, '-'))
for key, value in msg_dic.items():
print(f"商品:{key}, 单价:{value} ".ljust(40, '-'))
print(''.center(46, '-'))
shop_name = ""
shop_count = ""
shop_name = input("请输入您要购买的商品>>>:")
# 判断商品是否存在
if shop_name.strip().lower() not in msg_dic:
# 输入有误要求重新输入
print("您输入商品不存在或输入非法,请重新输入")
# 输入的商品在商品列表中
else:
# 在购物车就更新数量,不在就加入
shop_count = input("请输入您要购买商品数量>>>:")
if not shop_count.strip().isdigit():
# 暂时是重新输入商品 + 数量, 应该是只需要重新输入数量就行了
print("您的输入有误,请重新输入!")
continue
# 上面的if 已经确定 输入的是数字了,现在给他转成数字方便运算
shop_count = int(shop_count)
# 输入完毕将商品加入购物车(商品名、价格和个数) is_in_car = False
# 判断这个商品在不在购物车里
for shop_info in shop_car:
# 在,那就给他更新个数
if shop_info.get('shop_name') == shop_name:
shop_info['shop_count'] += shop_count
# print(shop_info.setdefault(shop_price, msg_dic.get(shop_name)))
is_in_car = True
# 不是购物车里的商品,那就添加到购物车
if not is_in_car:
# print(shop_car)
# 新增一个字典,给它的值设
# new_shop = dict()
new_shop = dict(shop_name=shop_name, shop_count=shop_count, shop_price=msg_dic.get(shop_name))
# new_shop['shop_name'] = shop_name
# new_shop['shop_count'] = shop_count
# new_shop['shop_price'] = msg_dic.get(shop_name)
# print(new_shop) # 可以打印出来,添加商品成功
shop_car.append(new_shop) # 同样的商品应该是数量累加
choice = input("商品已加入购物车,输入Q / E 查看购物车(退出程序), 输入C / Y 继续购买>>>:").strip().lower()
if choice in ['q', 'quit', 'e', 'exit']:
# 输出购买信息
print('您的购物车信息如下:')
# 循环输出购物车每个商品
print("购物车清单".center(40, '-')) for single_shop_info in shop_car:
from_car_shop_name = single_shop_info.get('shop_name')
from_car_shop_count = single_shop_info.get('shop_count')
from_car_shop_price = single_shop_info.get('shop_price')
# print(type(total_price), type(from_car_shop_count), type(from_car_shop_price))
total_price += int(from_car_shop_count) * int(from_car_shop_price)
print(f"商品:{from_car_shop_name},数量:{from_car_shop_count},单价为:{from_car_shop_price}".center(40, ' '))
print("清单结束".center(40, '-'))
print(f'共: {total_price} 元'.ljust(40, ' '))
break
elif choice in ['c', 'continue', 'y', 'yes']:
print(f"您输入的 {shop_name}: {shop_count} 已加入购物车~")
# 已经加入购物车了

实现代码

'''
3.统计s='hello alex alex say hello sb sb'中每个单词的个数
结果如:{'hello': 2, 'alex': 2, 'say': 1, 'sb': 2}
'''
s = 'hello alex alex say hello sb sb'
s_list = s.split(' ')
s_dict = {}
for word in s_list:
if word in s_dict.keys():
s_dict[word] += 1
else:
s_dict[word] = 1
print(s_dict)
# {'hello': 2, 'alex': 2, 'say': 1, 'sb': 2}

实现代码

# 4.关系运算
#   有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
#   pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
#   linuxs={'wupeiqi','oldboy','gangdan'}
#   1. 求出即报名python又报名linux课程的学员名字集合
#   2. 求出所有报名的学生名字集合
#   3. 求出只报名python课程的学员名字
#   4. 求出没有同时这两门课程的学员名字集合
pythons = {'alex', 'egon', 'yuanhao', 'wupeiqi', 'gangdan', 'biubiu'}
linuxs = {'wupeiqi', 'oldboy', 'gangdan'}
# 1. 求出即报名python又报名linux课程的学员名字集合
print(pythons & linuxs)
# {'wupeiqi', 'gangdan'} # 2. 求出所有报名的学生名字集合
print(pythons | linuxs)
# 'egon', 'wupeiqi', 'yuanhao', 'biubiu', 'gangdan', 'alex', 'oldboy'} # 3. 求出只报名python课程的学员名字
print(pythons - linuxs)
# {'alex', 'biubiu', 'yuanhao', 'egon'} # 4. 求出没有同时这两门课程的学员名字集合
print(pythons ^ linuxs)
# {'biubiu', 'oldboy', 'alex', 'yuanhao', 'egon'}

实现代码

'''
5. 对列表l=['a','b',1,'a','a']内的元素完成去重得到新列表.
拔高:如果想去重并且想保持列表原来的顺序该如何做?
'''
# 1. 仅去重
l = ['a', 'b', 1, 'a', 'a']
l2 = list(set(l))
print(l2)
# ['a', 1, 'b'] # 2.保持原来顺序的去重
# 方式一,通过 .count 方法
l = ['a', 'b', 1, 'a', 'a']
l2 = []
for i in l:
if l2.count(i) == 0:
l2.append(i)
print(l2)
# ['a', 'b', 1] # 方式二,通过成员方法 in / not in
l2 = []
for dic in l:
if dic not in l2:
l2.append(dic)
print(l2)

实现代码

# 6.对如下列表中的元素去重(),得到新列表,且新列表一定要保持列表原来的顺序
# l=[
# {'name':'egon','age':18,'sex':'male'},
# {'name':'alex','age':73,'sex':'male'},
# {'name':'egon','age':20,'sex':'female'},
# {'name':'egon','age':18,'sex':'male'},
# {'name':'egon','age':18,'sex':'male'},
# ]  
# 小提示:去重不一定非要用集合
l = [
{'name': 'egon', 'age': 18, 'sex': 'male'},
{'name': 'alex', 'age': 73, 'sex': 'male'},
{'name': 'egon', 'age': 20, 'sex': 'female'},
{'name': 'egon', 'age': 18, 'sex': 'male'},
{'name': 'egon', 'age': 18, 'sex': 'male'},
]
l2 = []
for dic in l:
if l2.count(dic) == 0:
# if dic not in l2: # 方式二
l2.append(dic)
print(l2)
# [{'name': 'egon', 'age': 18, 'sex': 'male'}, {'name': 'alex', 'age': 73, 'sex': 'male'}, {'name': 'egon', 'age': 20, 'sex': 'female'}]

实现代码

python元组-字典-集合及其内置方法(下)的更多相关文章

  1. python的组合数据类型及其内置方法说明

    python中,数据结构是通过某种方式(例如对元素进行编号),组织在一起数据结构的集合. python常用的组合数据类型有:序列类型,集合类型和映射类型 在序列类型中,又可以分为列表和元组,字符串也属 ...

  2. day07-列表类型/元组类型/字典类型/集合类型内置方法

    目录 列表类型内置方法 元组类型内置方法 字典类型内置方法 集合类型内置方法 列表类型内置方法 用来存多个元素,[]内用逗号隔开任意数据类型的元素 1. list()强制类型转换 print(list ...

  3. Day 07 数据类型的内置方法[列表,元组,字典,集合]

    数据类型的内置方法 一:列表类型[list] 1.用途:多个爱好,多个名字,多个装备等等 2.定义:[]内以逗号分隔多个元素,可以是任意类型的值 3.存在一个值/多个值:多个值 4.有序or无序:有序 ...

  4. 元组/字典/集合内置方法+简单哈希表(day07整理)

    目录 二十三.元组内置方法 二十四.字典数据类型 二十五 集合内置方法 二十五.数据类型总结 二十六.深浅拷贝 补充:散列表(哈希表) 二十三.元组内置方法 什么是元组:只可取,不可更改的列表 作用: ...

  5. python中列表 元组 字典 集合的区别

    列表 元组 字典 集合的区别是python面试中最常见的一个问题.这个问题虽然很基础,但确实能反映出面试者的基础水平. (1)列表 什么是列表呢?我觉得列表就是我们日常生活中经常见到的清单.比如,统计 ...

  6. **python中列表 元组 字典 集合

    列表 元组 字典 集合的区别是python面试中最常见的一个问题.这个问题虽然很基础,但确实能反映出面试者的基础水平. 1.列表 列表是以方括号“[]”包围的数据集合,不同成员以“,”分隔. 列表的特 ...

  7. day09-2 字典,集合的内置方法

    目录 字典的内置方法 作用 定义方式 方法 优先掌握 需要掌握 存储一个值or多个值 有序or无序 可变or不可变 集合的内置方法 作用 定义方式 方法 存储一个值or多个值 有序or无序 可变or不 ...

  8. python3笔记十八:python列表元组字典集合文件操作

    一:学习内容 列表元组字典集合文件操作 二:列表元组字典集合文件操作 代码: import pickle  #数据持久性模块 #封装的方法def OptionData(data,path):    # ...

  9. python_列表——元组——字典——集合

    列表——元组——字典——集合: 列表: # 一:基本使用# 1.用途:存放多个值 # 定义方式:[]内以逗号为分隔多个元素,列表内元素无类型限制# l=['a','b','c'] #l=list([' ...

随机推荐

  1. 开源代码分析工具 good

    checkstyle - static code analysis tool for JavaPMD - A source code analyzer

  2. 浅谈js闭包(closure)

    相信很多从事js开发的朋友都或多或少了解一些有关js闭包(closure)的知识. 本篇文章是从小编个人角度,简单地介绍一下有关js闭包(closure)的相关知识.目的是帮助一些对js开发经验不是很 ...

  3. Spring之bean后处理器

    Bean后处理器是一种特殊的Bean,容器中所有的Bean在初始化时,均会自动执行该类的两个方法.由于该Bean是由其它Bean自动调用执行,不是程序员手工调用,故此Bean无须id属性.需要做的是, ...

  4. # 构建以及运行Springboot Docker镜像时的变量传递

    Docker可以把我们的运行环境打包,然后我们只要run就可以了.大部分hello world都是这么写的.但都缺少了实际应用环节.以springboot为例,hello world的Dockerfi ...

  5. 基于 ZooKeeper 搭建 Spark 高可用集群

    一.集群规划 二.前置条件 三.Spark集群搭建         3.1 下载解压         3.2 配置环境变量         3.3 集群配置         3.4 安装包分发 四.启 ...

  6. jmeter模拟spike测试(尖峰测试)

    概述 尖峰测试(Spike testing)在性能测试中属于压力测试的一个子集.指的是在某一瞬间或者多个频次下用户数和压力陡然增加的场景. 为了验证我们的网站在访问用户急剧增加的情况下,或者短时间内反 ...

  7. 【docker学习一】CentOS7.5+Docker安装及使用「安装、查看、pull、创建、进入镜像」

    记录安装配置以及使用的过程,可能会有多处摘抄,已注明照抄地址,侵删. 是什么:个人理解,是一种移植性很强的虚拟机,支持版本控制(类似于git),同一个服务器可以运行多个docker容器,每个docke ...

  8. [MFC.Windows程序设计(第2版) 第一章

    1,windows编程模型如下图: 2, windows的消息有成百上千种,以下列举10个: 3,消息处理函数的四个参数:窗口句柄(表示消息属于哪个窗口,32值.该窗口句柄引用一个数据结构,数据结构存 ...

  9. linux命令---grep命令使用

    grep 常用参数: -w 精准匹配 -r 递归匹配 -l 列出匹配内容的文件名称-v 排除 结合sed,批量替换文件内容 sed 's#10.151.30.165#10.0.3.162#g' -i ...

  10. 透视BlueStore存储结构:如何根据文件名从裸盘提取文件内容

    在FileStore下,用户文件经过切分对象块后最终存放在了单机文件系统(xfs .ext4等)中,我们可以较容易地找到这些对象块对应的文件,然后提取这些对象块文件后组装成用户文件.然而,BlueSt ...