每日一课 | 你知道和不知道python字典都在这!!

【导语】:你是否了解Python字典,以及创建Python字典都有哪些的实际的应用操作,还有如何访问字典中的值等等,此文章就是针对这些问题,给出超出你预期的答案。

本文从七个方面介绍字典,包括:字典创建的5种方式、访问字典元素、字典元素添加、字典元素删除、字典的排序、字典的其他方法、序列解包(拆包)。

字典

字典是“键值对”的无序可变序列,字典中的每个元素都是一个“键值对”,包含:“键对象”和“值对象”。可以通过“键对象”实现快速获取、删除、更新对应的“值对象”。

列表中我们通过“下标数字”找到对应的对象。字典中通过“键对象”找到对应的“值对象”。

“键”:是任意的不可变数据,比如:整数、浮点数、字符串、元组。但是:列表、字典、集合这些可变对象,不能作为“键”。并且“键”不可重复。不清楚可变类型与不可变类型,可参考另一边文章https://www.jianshu.com/p/950ad5a55b64

“值”:可以是任意的数据,并且可重复。

空字典表示方式:{}或dict()

1.创建字典


#方式一:{key:value}
# {key: value}

dict1 = {'one': 1, 'two': 2, 'three': 3}
print(dict1)
#方式二:dict()

# dict(zip(keys, values))
# 或dict([(k, v), (k, v)])
# 或dict(((k, v), (k, v)))

k = ['one', 'two', 'three']
v = [1, 2, 3]
dict2 = dict(zip(k, v))
print(dict2)

dict3 = dict([('one', 1), ('two', 2), ('three', 3)])
print(dict3)

dict3 = dict((('one', 1), ('two', 2), ('three', 3)))
print(dict3)
#方式三:dict(key=value)

# dict(key=value)

dict4 = dict(one=1, two=2, three=3)
print(dict4)
#方式四:字典推导

# 字典推导式

lst1 = ['one', 'two', 'three']
lst2 = [1, 2, 3]
dict5 = {lst1[i]: lst2[i] for i in range(len(lst1))}
print(dict5)
方式五:fromkeys()

# fromkeys()

# 没有指定value,默认None
dict6 = dict.fromkeys(['k1', 'k2', 'k3'])
print(dict6)  # {'k1': None, 'k2': None, 'k3': None}

# 指定value
dict7 = dict.fromkeys(['k1', 'k2', 'k3'], 'value')
print(dict7)  # {'k1': 'value', 'k2': 'value', 'k3': 'value'}

2.访问字典元素

#定义一个字典
a = {'name': 'Lucy', 'age': 18, 'job': 'programmer'}

1.通过[键]获得“值”。若键不存在,则抛出异常。

a = {'name': 'Lucy', 'age': 18, 'job': 'programmer'}
print(a['name'])  # Lucy
print(a['sex'])  # 报错

2.通过get()方法获得“值”。推荐使用。优点是:指定键不存在,返回None;也可以设定指定键不存在时默认返回的对象。推荐使用get()获取“值对象”。

a = {'name': 'Lucy', 'age': 18, 'job': 'programmer'}

print(a.get('sex', '不存在此键'))  # 不存在此键

3.列出所有的键值对。

for k, v in a.items():
    print(k, v)

4.列出所有的键,列出所有的值。

for k in a.keys():
    print(k)

for v in a.values():
    print(v)

5.检测一个“键”是否在字典中。

print('name' in a)  # True

3.字典元素添加

给字典新增“键值对”。如果“键”已经存在,则覆盖旧的键值对;如果“键”不存在,则新增“键值对”。

a = {'name': 'Lucy', 'age': 18, 'job': 'programmer'}
a['adder'] = '上海市'
print(a)
update()

# 更新,有则覆盖,无则添加
# 1. 增加键值对
# 方式一:
dic9 = {'name': 'lucy', 'age': 18}
dic9.update(hobby='运动', hight=178)
print(dic9)  # {'name': 'lucy', 'age': 18, 'hobby': '运动', 'hight': 178}

# 方式二:
dic10 = {'name': 'lucy', 'age': 18}
dic10.update([('hobby', '运动'), ('hight', 178)])
print(dic10)  # {'name': 'lucy', 'age': 18, 'hobby': '运动', 'hight': 178}

dic10 = {'name': 'lucy', 'age': 18}
dic10.update((('hobby', '运动'), ('hight', 178)))
print(dic10)  # {'name': 'lucy', 'age': 18, 'hobby': '运动', 'hight': 178}

# 方式三:
dic11 = {'name': 'lucy', 'age': 18}
dic12 = {'name': 'tom', 'hight': 178}
dic11.update(dic12)
print(dic11)  # {'name': 'tom', 'age': 18, 'hight': 178}

# 2. 修改键所对应的值
dic13 = {'name': 'lucy', 'age': 18}
dic13.update(name='tom')
print(dic13)  # {'name': 'tom', 'age': 18}

setdefault(key,default)

# setdefault(key,default)
# 如果default省略,向字典中添加了key:None,
# 如果dedault未省略。则向字典中添加了key:default
dict1 = {"name": "张三", "age": 18, "score": 100, "hobby": "篮球"}
print(dict1)
dict1.setdefault("111")
print(dict1)  # {'name': '张三', 'age': 18, 'score': 100, 'hobby': '篮球', '111': None}

dict1.setdefault("222", 222)
print(dict1)  # {'name': '张三', 'age': 18, 'score': 100, 'hobby': '篮球', '111': None, '222': 222}

4.字典元素删除


#pop() 删除指定键值对,并返回对应的“值对象”。

a = {'name': 'Lucy', 'age': 18, 'job': 'programmer'}
b = a.pop('age')
print(b)  # 18
print(a)  # {'name': 'Lucy', 'job': 'programmer'}
#popitem() 随机删除一个键值对,并返回。若想一个接一个地移除并处理项,这个方法就非常有效。

a = {'name': 'Lucy', 'age': 18, 'job': 'programmer'}
b = a.popitem()
print(b)
a = {'name': 'Lucy', 'age': 18, 'job': 'programmer'}
for i in range(len(a)):
    a.popitem()
print(a)  # {}
clear()

#clear() 删除所有键值对

a = {'name': 'Lucy', 'age': 18, 'job': 'programmer'}
a.clear()
print(a)  # {}
del

a = {'name': 'Lucy', 'age': 18, 'job': 'programmer'}
del a['name']
print(a)  # {'age': 18, 'job': 'programmer'}

5.字典的排序

dts = dict(a=3,b=2,c=1)
dts
# 按照键排序
dts = sorted(dts.items(),key=lambda x:x[0],reverse=True)
# 按照值排序
dts = sorted(dts.items(),key=lambda x:x[1],reverse=True)
dts

6.字典的其他方法

① copy()
import copy
# a.copy(),和列表的使用完全相同,拷贝的是最外层的地址
dict4 = {"name": "张三", "age": 18, "score": 100, "hobby": "篮球"}
print(dict4)
dict5 = dict4.copy()
dict4["name"] = "jack"
print(dict4)
print(dict5)
print(dict5 is dict4)

print("*" * 20)

# 思考问题,列表和字典的拷贝
# a.
list1 = [1, 2, 3, {"name": "张三", "age": 18}]
list2 = list1.copy()
list1[-1]["age"] = 20
print(list2)

# b

list1 = [1, 2, 3, {"name": "张三", "age": 18}]
list2 = copy.deepcopy(list1)
list1[-1]["age"] = 20
print(list2)

print("*" * 30)

# c
dict4 = {"hobby": ["篮球"]}
print(dict4)
dict5 = dict4.copy()
dict4["hobby"].append("足球")
print(dict5)

② collections
# 实现键保留 值相加
from collections import defaultdict
d = defaultdict(int)

objs = [{'F29958SVDK6': 12}, {'F29958SVDK5': 12}, {'F29958SVDK6': 12}, {'F29958SVDK6': 12}, {'F29958SVDK6': 12}]
for obj in objs:
    for key, value in obj.items():
        d[key] += value
print(d)

7.序列解包(拆包)

序列解包可以用于元组、列表、字典,可以让我们方便的对多个变量赋值。

>>> x,y,z = (10,20,30)
>>> x
10
>>> y
20
>>> z
30
>>> a,b,c = [10,20,30]
>>> a
10
>>> b
20
>>> c
30

序列解包用于字典时,默认是对“键”进行操作;如果需要对键值对操作,则需要使用items();如果需要对“值”进行操作,则需要使用values();

di = {'name': 'Lucy', 'age': 18, 'job': 'programmer'}
a, b, c = di
print(a, b, c)  # name age job

a, b, c = di.items()
print(a)  # ('name', 'Lucy')

a, b, c = di.values()
print(a)  # Lucy

参考链接:https://blog.csdn.net/mall_lucy/article/details/106601632

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355