python基础基础数据类型3

发布于 2021-04-17 05:46 ,所属分类:知识学习综合资讯


目录

基础数据类型:

字典(dict)

集合(set)




基础数据类型

字典(dict)

字典可以存储大量关联性比较强的数据,查询速度非常快,但内存消耗巨大。

(点击查看大图)



字典的创建

# 创建字典{'one': 1, 'two': 2, 'three': 3}
'''方式一'''dic1 = {'one': 1, 'two': 2, 'three': 3}

'''方式二'''dic = dict() # 创建空字典print(dic) # {}
dic2 = dict((('one', 1), ('two', 2), ('three', 3)))dic3 = dict([('one', 1), ('two', 2), ('three', 3)])
dic3 = dict(one=1, two=2, three=3)
dic4 = dict({'one': 1, 'two': 2, 'three': 3})
dic5 = dict(zip(['one', 'two', 'three'], [1, 2, 3]))

'''方式三:字典推导式'''dic6 = {k: v for k, v in [('one', 1), ('two', 2), ('three', 3)]}

(左右滑动查看完整代码)



'''方式四:利用fromkey  字典的所有key来自一个可迭代对象  字典的value使用同一个值'''
dic7 = dict.fromkeys('abcd', 'pamela')print(dic7) # {'a': 'pamela', 'b': 'pamela', 'c': 'pamela', 'd': 'pamela'}
dic8 = dict.fromkeys(['one', 'two', 'three'], 123)print(dic8) # {'one': 123, 'two': 123, 'three': 123}

'''!如果通过fromkeys得到的字典的value为可变数据类型,要注意'''dic = dict.fromkeys([1, 2, 3], [])print(dic) # {1: [], 2: [], 3: []}dic[1].append(666)print(dic) # {1: [666], 2: [666], 3: [666]}print(id(dic[1]), id(dic[2]), id(dic[3])) # 1655023409736 1655023409736 1655023409736

(左右滑动查看完整代码)




字典的合法性


字典以{}括起来,里面的内容是以键值对的形式储存的。


键key:必须是不可变(可哈希)的数据类型,并且键是唯一的,不重复的。


值Value:可以是任意数据(int,str,bool,tuple,list,dict,set),包括实例对象等。


不可变(可哈希)的数据类型:int,str,bool,tuple。

可变(不可哈希)的数据类型:list,dict,set。


# 合法dic = {123: 456, True: 999, "id": 1, "name": 'pamela', "age": 18, "s": ['abc', 'def'], (1, 2, 3): 'apple'}print(dic[123]) # 456print(dic[True]) # 999print(dic['id']) # 1print(dic['s']) # ['abc', 'def']print(dic[(1, 2, 3)]) # apple

# 不合法dic = {[1, 2, 3]: 'abc'} # list是可变的. 不能作为key TypeError: unhashable type: 'list'dic = {{1: 2}: "abc"} # dict是可变的. 不能作为key TypeError: unhashable type: 'dict'dic = {{1, 2, 3}: 'abc'} # set是可变的, 不能作为key TypeError: unhashable type: 'set'

(左右滑动查看完整代码)




字典的增删改查


1.增

'''通过键值对直接增加:  没有此key,就增加键值对  有此key,就修改key对应的value'''
dic = {'name': 'pamela', 'age': 18}dic['weight'] = 75 # 没有weight这个key,就增加键值对print(dic) # {'name': 'pamela', 'age': 18, 'weight': 75}
dic['name'] = 'apple' # 有name这个key,就成了字典的改值print(dic) # {'name': 'apple', 'age': 18, 'weight': 75}

(左右滑动查看完整代码)



'''setdefault:  没有此key,就增加键值对  有此key,就不变  有返回值,返回值为增加的键值对中的value'''
dic = {'name': 'pamela', 'age': 18}dic.setdefault('height', 165) # 没有height这个键,则增加键值对print(dic) # {'name': 'pamela', 'age': 18, 'height': 165}
dic.setdefault('name', 'apple') # 有name这个键,则不变print(dic) # {'name': 'pamela', 'age': 18, 'height': 165}

# 有返回值dic = {'name': 'pamela', 'age': 18}ret1 = dic.setdefault('height', 165)print(ret1) # 165ret2 = dic.setdefault('name', 'apple')print(ret2) # pamela

(左右滑动查看完整代码)




2.删

'''pop  通过key删除字典的键值对   有返回值,返回值为删除的键值对中的value   可给字典中不存在的key设置返回值,不设置通过pop删除会报错'''
dic = {'name': 'pamela', 'age': 18}ret = dic.pop('name')print(ret) # pamelaprint(dic) # {'age': 18}

# 设置返回值dic1 = {'name': 'pamela', 'age': 18}ret1 = dic1.pop('n', None) # 给字典中不存在的key设置返回值,不设置执行会报错print(ret1, dic1) # None {'name': '太白', 'age': 18}
ret2 = dic1.pop('age', 10) # 给字典中存在的key设置返回值,没有任何意义print(ret2, dic1) # 18 {'name': 'pamela'}

(左右滑动查看完整代码)



'''popitem  删除最后一个键值对     (python3.6版本之前,popitem为随机删除)     有返回值,返回值为删除的键值对'''
dic = {'name': 'pamela', 'age': 18}ret = dic.popitem()print(ret) # ('age', 18)print(dic) # {'name': 'pamela'}

(左右滑动查看完整代码)



'''clear 清空字典'''
dic = {'name': 'pamela', 'age': 18}dic.clear()print(dic) # {}

(左右滑动查看完整代码)



'''del:  通过key删除字典的键值对,删除字典中不存在的key会报错  删除整个字典'''
dic = {'name': 'pamela', 'age': 18}del dic['name'] # 通过键删除键值对print(dic) # {'age': 18}
del dic # #删除整个字典print(dic) # NameError: name 'dic' is not defined

(左右滑动查看完整代码)




3.改

'''通过键值对直接改:  有此key,就修改key对应的value  没有此key,就增加键值对'''
dic = {'name': 'pamela', 'age': 18}dic['name'] = 'apple' # 有name这个key,就修改key对应的valueprint(dic) # {'name': 'apple', 'age': 18}
dic['height'] = 165 # 没有height这个key,就成了增加键值对print(dic) # {'name': 'apple', 'age': 18, 'height': 165}

(左右滑动查看完整代码)



'''update 修改原字典中的数据  有此key,就修改key对应的value  没有此key,就增加键值对'''
dic = {'name': 'pamela', 'age': 18}dic.update(sex='女', height=165)print(dic) # {'name': 'pamela', 'age': 18, 'sex': '女', 'height': 165}
dic1 = {'name': 'pamela', 'age': 18}dic1.update([(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')])print(dic1) # {'name': 'pamela', 'age': 18, 1: 'a', 2: 'b', 3: 'c', 4: 'd'}
dic3 = {"name": "pamela", "age": 18, "sex": "女"}dic4 = {"name": "apple", "weight": 75}dic3.update(dic4)print(dic3) # {'name': 'apple', 'age': 18, 'sex': '女', 'weight': 75}print(dic4) # {'name': 'apple', 'weight': 75}

(左右滑动查看完整代码)




4.查

'''通过key查询对应的value,查询字典中不存在的key会报错'''
dic = {'name': 'pamela', 'age': 18}print(dic['name']) # pamela

(左右滑动查看完整代码)



'''get  通过key查询对应的value   可给字典中不存在的key设置返回值,不设置就返回None'''
dic = {'name': 'pamela', 'age': 18}print(dic.get('name')) # 'pamela'print(dic.get('name1')) # Noneprint(dic.get('name2', '没有此键')) # 没有此键

(左右滑动查看完整代码)



'''keys  获取字典所有的key    一个高仿列表,可以通过list()转化成列表,也可以直接循环打印'''
dic = {'name': 'pamela', 'age': 18}key_list = dic.keys() print(key_list) # dict_keys(['name', 'age']) # 一个高仿列表,存放的都是字典中的key
# 这个高仿列表可以通过list()转化成列表print(list(key_list)) # ['name', 'age']
# 这个高仿列表可以直接循环打印for i in dic.keys(): print(i) # name age

(左右滑动查看完整代码)



'''values  获取字典所有的value     一个高仿列表,可以通过list()转化成列表'''
dic = {'name': 'pamela', 'age': 18}value_list = dic.values() print(value_list) # dict_values(['pamela', 18]) # 一个高仿列表,存放的都是字典中的value
# 这个高仿列表可以通过list()转化成列表print(list(value_list)) # ['pamela', 18]
# 这个高仿列表可以直接循环打印for i in dic.values(): print(i) # pamela 18

(左右滑动查看完整代码)



'''items  获取字典所有的键值对    一个高仿列表,可以通过list()转化成列表,列表中是多个元组'''
dic = {'name': 'pamela', 'age': 18}key_value_list = dic.items() print(key_value_list) # dict_items([('name', 'pamela'), ('age', 18)])# 一个高仿列表,存放的是多个元祖,元祖中第一个是字典中的key,第二个是字典中的value  
# 这个高仿列表可以通过list()转化成列表print(list(key_value_list)) # [('name', 'pamela'), ('age', 18)]
# 这个高仿列表可以直接循环打印for i in dic.items(): print(i) # ('name', 'pamela') ('age', 18)

(左右滑动查看完整代码)



'''for循环查询'''dic = {'name': 'pamela', 'age': 18}
for i in dic: '''直接循环字典,默认打印字典的key''' print(i) # name age for i in dic.keys(): '''循环打印字典的key''' print(i) # name age for i in dic.values(): '''循环打印字典的value''' print(i) # pamela 18 for i in dic.items(): '''循环打印字典的键值对(元组形式)''' print(i) # ('name', 'pamela') ('age', 18)

(左右滑动查看完整代码)



'''拆包(分别赋值)'''
a, b = 1, 2print(a, b) # 1 2
a, b = ('pamela','123') # 元组的拆包print(a, b) # pamela 123
a, b = ['pamela','123']print(a, b) # pamela 123
a, b = {'name': 'pamela', 'age': 18}print(a, b) # name age

'''通过拆包循环获取字典的key和value'''dic = {'name': 'pamela', 'age': 18}for k, v in dic.items(): print('这是键', k) print('这是值', v)

(左右滑动查看完整代码)




字典的嵌套

dic = { 'name': ['pamela', 2, 3, 5], 'job': 'test', 'study': {'pamela': ['python', 'selenium', 100]} }
# 将name对应的列表追加⼀个元素’apple’。dic['name'].append('apple')print(dic) # {'name': ['pamela', 2, 3, 5, 'apple'], 'job': 'test', 'study': {'pamela': ['python', 'selenium', 100]}}
# 将name对应的列表中的pamela⾸字⺟⼤写。dic['name'][0] = dic['name'][0].capitalize()print(dic) # {'name': ['Pamela', 2, 3, 5, 'apple'], 'job': 'test', 'study': {'pamela': ['python', 'selenium', 100]}}
# 将study对应的字典加⼀个键值对’apple’,’linux’。dic['study']['apple'] = 'linux'print(dic) # {'name': ['Pamela', 2, 3, 5, 'apple'], 'job': 'test', 'study': {'pamela': ['python', 'selenium', 100], 'apple': 'linux'}}
# 将study对应的字典中的pamela对应的列表中的selenium删除dic['study']['pamela'].remove('selenium')print(dic) # {'name': ['Pamela', 2, 3, 5, 'apple'], 'job': 'test', 'study': {'pamela': ['python', 100], 'apple': 'linux'}}

(左右滑动查看完整代码)




集合(set)

集合是无序的,不重复的数据集合,它里面的元素必须是不可变的(int,str,bool,tuplel),但是集合本身是可变的。


集合最重要的两点:

去重:把一个列表变成集合,就自动去重了。

关系测试:测试两组数据之间的交集、差集、并集等关系。

(点击查看大图)



集合的创建

'''方式一'''set1 = set() # 创建空集合print(set1) # set()
set2 = set({1, 2, 'pamela', True})print(set2) # {1, 2, 'pamela', True}
'''方式二'''set3 = {1, 2, 'pamela', False}print(set3) # {1, 2, 'pamela', False}

(左右滑动查看完整代码)




集合的增删


1.增

'''add 增加指定的元素'''set1 = {'pamela', 'apple', 'test', 123}set1.add('abc')print(set1) # {'pamela', 'abc', 'test', 'apple', 123}

(左右滑动查看完整代码)



'''update 迭代着增加'''set1 = {'pamela', 'apple', 'test', 123}set1.update('A')print(set1) # {'apple', 'pamela', 'A', 'test', 123}set1.update('中文')print(set1) # {'apple', 'pamela', 'A', '文', '中', 'test', 123}set1.update([1, 2, 3])print(set1) # {1, 2, 'apple', 3, 'pamela', 'A', '文', '中', 'test', 123}

(左右滑动查看完整代码)




2.删

'''remove 删除指定的元素'''set1 = {'pamela', 'apple', 'test', 123}set1.remove('pamela')print(set1) # {'apple', 123, 'test'}

(左右滑动查看完整代码)



'''pop 随机删除一个元素'''set1 = {'pamela', 'apple', 'test', 123}set1.pop()print(set1) # {123, 'pamela', 'test'}

(左右滑动查看完整代码)



'''clear 清空集合'''set1 = {'pamela', 'apple', 'test', 123}set1.clear()print(set1) # set()

(左右滑动查看完整代码)



'''del 删除集合'''set1 = {'pamela', 'apple', 'test', 123}del set1print(set1) # NameError: name 'set1' is not defined

(左右滑动查看完整代码)




3.变相改值:集合是无序的,所以不能查询和直接改值,但是可以间接改值,先删除再增加。

set1 = {'pamela', 'apple', 'test', 123}set1.remove('pamela') # 先删除set1.add('abc') # 再增加print(set1) # {'abc', 123, 'test', 'apple'}




集合的其他操作


(关系测试)

'''交集(& 或 intersection)'''set1 = {1, 2, 3, 4, 5}set2 = {4, 5, 6, 7, 8}print(set1 & set2) # {4, 5}print(set1.intersection(set2)) # {4, 5}

(左右滑动查看完整代码)



'''并集(| 或 union)'''set1 = {1, 2, 3, 4, 5}set2 = {4, 5, 6, 7, 8}print(set1 | set2) # {1, 2, 3, 4, 5, 6, 7,8}print(set2.union(set1)) # {1, 2, 3, 4, 5, 6, 7,8}

(左右滑动查看完整代码)



'''差集(- 或 difference)'''set1 = {1, 2, 3, 4, 5}set2 = {4, 5, 6, 7, 8}print(set1 - set2) # {1, 2, 3}print(set1.difference(set2)) # {1, 2, 3}

(左右滑动查看完整代码)



'''反交集 (^ 或 symmetric_difference)'''set1 = {1, 2, 3, 4, 5}set2 = {4, 5, 6, 7, 8}print(set1 ^ set2) # {1, 2, 3, 6, 7, 8}print(set1.symmetric_difference(set2)) # {1, 2, 3, 6, 7, 8}

(左右滑动查看完整代码)



'''子集 (< 或 issubset)'''set1 = {1, 2, 3}set2 = {1, 2, 3, 4, 5, 6}print(set1 < set2) # True,set1是set2子集print(set1.issubset(set2)) # True,set1是set2子集

(左右滑动查看完整代码)



'''超集 (> 或 issuperset)'''set1 = {1, 2, 3}set2 = {1, 2, 3, 4, 5, 6}print(set2 > set1) # True,set2是set1超集print(set2.issuperset(set1)) # True,set2是set1超集

(左右滑动查看完整代码)



'''frozenset  不可变集合,让集合变成不可变类型'''s = frozenset('pamela')print(s) # frozenset({'l', 'p', 'm', 'e', 'a'})print(type(s)) # <class 'frozenset'>

(左右滑动查看完整代码)




列表的去重


把一个列表变成集合,就自动去重了,但是不能保持原列表的顺序。

li = [1, 1, 6, 2, 2, 5, 3, 3, 4, 4]li_set = set(li)print(li_set) # {1, 2, 3, 4, 5, 6}li2 = list(li_set)print(li2) # [1, 2, 3, 4, 5, 6]

(左右滑动查看完整代码)




相关资源