天池Python练习08-字典

 

目录

1 字典

1.1 可变类型与不可变类型

1.2 字典的定义

1.3字典内置方法


1 字典

1.1 可变类型与不可变类型


        1.序列是以连续的整数作为索引,与此不同的是,字典以“关键词”为索引,关键字可以是任意不可变类型,通常用字符或者数值。
        2.字典是python唯一的一个映射类型,字符串、元组、列表属于序列类型。

判断一个数据类型是否为课表类型:
        1.用id(x)函数,对x进行某种操作,比较操作前后的id,如果不一样则x不可变如果一样,则x可变。
        2.用hash(x)函数,只要不报错证明x可以被哈希,否则不可以被哈希,既可变。

i = 1
print(id(i))
>>>2017486924080

i = i + 1
print(id(i))
>>>2017486924112

l = [1,2]
print(id(l))
>>>2017649726976

l.append('3q')
print(id(l))
>>>2017649726976


        1.i在进行加一之后id和之前不一样,因此加完之后的这个i(虽然名字没变),但已经不是之前那个i了,此整数是不可变类型。
        2.列表l在附加3q之后的id和之前一样,因此列表是可变类型。

print(hash('abc'))
>>>7702665277697577989

print(hash((1,2,'python')))
>>>3632879410630742111

print(hash([1,2,'python']))
>>>TypeError: unhashable type: 'list'

print(hash({1,2,3}))
>>>TypeError: unhashable type: 'set'

        1.数值、字符和元组都能被哈希,因此他们是不可变类。
        2.列表、集合和字典不能被哈希,因此它是可变类型。

1.2 字典的定义


字典是无序的 键:值(key:value)对集合,键必须是互不相同的(在同一个字典内)。
1.dict内部存放的顺序和key放入的顺序没有关系。
2.dict查找和插入的速度极快,不会随着key的增加而增加,但是需要占用大量的内存。

字典的定义语法为{元素1,元素2...元素n}
1.其中一个元素是一个 键值对
2.关键点是 大括号{}, 逗号, 和冒号:
3.大括号-- 把所有元素绑在一起
4.逗号-- 把每个键值对分开
5.冒号-- 把键值分开

 

创建和访问字典

brand = ['李宁', '耐克', '阿迪达斯']
slogan = ['一切皆有可能', 'Just do it', 'Impossible is nothing']
print('耐克的口号是:', slogan[brand.index('耐克')]) 
>>>耐克的口号是: Just do it

dic = {'李宁': '一切皆有可能', '耐克': 'Just do it', '阿迪达斯': 'Impossible is nothing'}
print('耐克的口号是:', dic['耐克']) 
>>>耐克的口号是: Just do it

通过字符串或数值作为key来创建字典
注意:如果我们取的键在字典中不存在,会直接报错keyerror

dic1 = {1:'one',2:'two',3:'three'}
print(dic1)
>>>{1: 'one', 2: 'two', 3: 'three'}

print(dic1[1])
>>>one

print(dic1[4])
>>>KeyError: 4

通过元组作为key来创建字典,但是一般不这样使用

dic = {(1, 2, 3): "Tom", "Age": 12, 3: [3, 5, 7]}
print(dic) 
>>>{(1, 2, 3): 'Tom', 'Age': 12, 3: [3, 5, 7]}

print(type(dic)) 
>>><class 'dict'>

通过构造函数dict来创建字典
dict() 创建一个空字典
        通过把可以直接把数据放入字典中,单一个key只能对应一个value,多次对一个key放入value会把前面的值冲掉。

dic = dict()
dic['a'] = 1
dic['b'] = 2
dic['c'] = 3

print(dic)
>>>{'a': 1, 'b': 2, 'c': 3}

dic['a'] = 11
print(dic)
>>>{'a': 11, 'b': 2, 'c': 3}

dic['d'] = 12
print(dic)
>>>{'a': 11, 'b': 2, 'c': 3, 'd': 12}

dict(mapping) 用mapping键值对初始化一个新字典

dic1 = dict([('apple', 4139), ('peach', 4127), ('cherry', 4098)])
print(dic1) 
>>>{'cherry': 4098, 'apple': 4139, 'peach': 4127}

dic2 = dict((('apple', 4139), ('peach', 4127), ('cherry', 4098)))
print(dic2) 
>>>{'peach': 4127, 'cherry': 4098, 'apple': 4139}

        dict(**kwargs) -> new dictionary initialized with the name=value pairs in the keyword argument list. For example: dict(one=1, two=2)

        这种情况下,键只能作为字符串类型,并且创建的时候字符串不能加引号,加上就会语法报错。

dic = dict(name='Tom', age=10)
print(dic) 
>>>{'name': 'Tom', 'age': 10}

print(type(dic)) 
>>><class 'dict'>

1.3字典内置方法

        dict.fromkeys(seq[,value])用于创建一个新字典,以序列seq中元素做字典键,value为字典所有键对应的初始值。

seq = ('name','age','sex')
dit1 = dict.fromkeys(seq)
print("新字典为:%s" % str(dit1))
>>>新字典为:{'name': None, 'age': None, 'sex': None}

dic2 = dict.fromkeys(seq,10)
print("新字典为:%s" % str(dic2))
>>>新字典为:{'name': 10, 'age': 10, 'sex': 10}

dic3 = dict.fromkeys(seq, ('小马', '8', '男'))
print("新的字典为 : %s" % str(dic3))
>>>新的字典为 : {'name': ('小马', '8', '男'), 'age': ('小马', '8', '男'), 'sex': ('小马', '8', '男')}

dict.keys()返回一个可迭代对象,可以使用list()来转换为列表,列表为字典中的所有键。

dic = {'name':'lsp','age':7}
print(dic.keys())
>>>dict_keys(['name', 'age'])

lst = list(dic.keys())
print(lst)
>>>['name', 'age']

dict.value()返回一个迭代器,可以使用list()来转换为列表,列表为字典中的所有值。

dic = {'Sex': 'female', 'Age': 7, 'Name': 'Zara'}
print("字典所有值为 : ", list(dic.values())) 
>>>字典所有值为 :  ['female', 7, 'Zara']

dict.items() 以列表返回可遍历的 (键, 值) 元组数组。

dic = {'Name': 'Lsgogroup', 'Age': 7}
print("Value : %s" % dic.items()) 
>>>Value : dict_items([('Name', 'Lsgogroup'), ('Age', 7)])

print(tuple(dic.items())) 
>>>(('Name', 'Lsgogroup'), ('Age', 7))

dict.get(key, default=None) 返回指定键的值,如果值不在字典中返回默认值。

dic = {'Name': 'Lsgogroup', 'Age': 27}
print("Age 值为 : %s" % dic.get('Age')) 
>>>Age 值为 : 27

print("Sex 值为 : %s" % dic.get('Sex', "NA")) 
>>>Sex 值为 : NA

dict.setdefault(key, default=None) 和 get() 方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值。

dic = {'Name': 'Lsgogroup', 'Age': 7}
print("Age 键的值为 : %s" % dic.setdefault('Age', None))
>>>Age 键的值为 : 7

print("Sex 键的值为 : %s" % dic.setdefault('Sex', None)) 
>>>Sex 键的值为 : None

print("新字典为:", dic) 
>>>新字典为: {'Age': 7, 'Name': 'Lsgogroup', 'Sex': None}

key in dict in 操作符用于判断键是否存在于字典中,如果键在字典 dict 里返回 true ,否则返回 false 。而 not in 操作符刚好相反,如果键在字典 dict 里返回 false ,否则返回 true 。

dic = {'Name': 'Lsgogroup', 'Age': 7}
# in 检测键 Age 是否存在
if 'Age' in dic:
 print("键 Age 存在")
else:
 print("键 Age 不存在")
# 检测键 Sex 是否存在

>>>键 Age 存在

1. dict.pop(key[,default]) 删除字典给定键 key 所对应的值,返回值为被删除的值。 key 值必须给出。若 key不存在,则返回 default 值。
2. del dict[key] 删除字典给定键 key 所对应的值。

dic1 = {1: "a", 2: [1, 2]}
print(dic1.pop(1), dic1) 
>>>a {2: [1, 2]}

设置默认值,必须添加,否则报错

print(dic1.pop(3, "nokey"), dic1)
>>>nokey {2: [1, 2]}

del dic1[2]
print(dic1) 
>>>{}

dict.popitem() 随机返回并删除字典中的一对键和值,如果字典已经为空,却调用了此方法,就报出KeyError异常。

dic1 = {1: "a", 2: [1, 2]}
print(dic1.popitem()) 
>>>(1, 'a')

print(dic1) 
>>>{2: [1, 2]}

dict.clear() 用于删除字典内所有元素。

dic = {'Name': 'Zara', 'Age': 7}
print("字典长度 : %d" % len(dic)) 
>>>字典长度 : 2

dict.clear()

print("字典删除后长度 : %d" % len(dic)) 
>>>字典删除后长度 : 0

dict.copy() 返回一个字典的浅复制。

dic1 = {'Name': 'Lsgogroup', 'Age': 7, 'Class': 'First'}
dic2 = dic1.copy()
print("新复制的字典为 : ", dic2) 
>>>新复制的字典为 :  {'Name': 'Lsgogroup', 'Age': 7, 'Class': 'First'}

直接赋值和 copy 的区别

dic1 = {'user': 'lsgogroup', 'num': [1, 2, 3]}

引用对象

dic2 = dic1 

深拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用

dic3 = dic1.copy() 
print(id(dic1))
>>>148635574728

print(id(dic2)) 
>>>148635574728

print(id(dic3)) 
>>>148635574344

修改 data 数据

dic1['user'] = 'root'
dic1['num'].remove(1)

输出结果

print(dic1)
>>>{'user': 'root', 'num': [2, 3]}

print(dic2) 
>>>{'user': 'root', 'num': [2, 3]}

print(dic3) 
>>>{'user': 'lsgogroup', 'num': [2, 3]}

dict.update(dict2) 把字典参数 dict2 的 key:value 对 更新到字典 dict 里

dic = {'Name': 'Lsgogroup', 'Age': 7}
dic2 = {'Sex': 'female', 'Age': 8}
dic.update(dic2)
print("更新字典 dict : ", dic) 
>>>更新字典 dict : {'Sex': 'female', 'Age': 8, 'Name': 'Lsgogroup'}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值