字典与集合

字典dict

字典是python数据结构中最为重要的。常用的名字有哈希表、关联数组;
主要的特点为:键值对集合,其中键key和值value都是python对象;
(1)键是不可变的对象,值可以是任意的
(2)字典是一个无序的集合,序列由于没有key做对应,因此以顺序/索引来对应值,序列有序而字典无序

字典的创建

可以使用如下几种方式来创建字典
(1)使用{}花括号创建字典

mapping = {}
keylst = ['a', 'b', 'c']
valuelst = [1,2,3]

for key, value in zip(keylst, valuelst):
    mapping[key] = value
mapping
------------------------------------
{'a': 1, 'b': 2, 'c': 3}

(2)使用序列生成字典

keylst = ['a', 'b', 'c']
valuelst = [1,2,3]
dict(zip(keylst, valuelst)) 
-----------------------------------
{'a': 1, 'b': 2, 'c': 3}

zip函数我们在后续章节会做介绍

(3)使用dict.fromkeys(lst)方法

keylst = ['a', 'b', 'c']
dict.fromkeys(keylst)
dict.fromkeys(keylst, 'today')
-----------------------
{'a': None, 'b': None, 'c': None}
{'a': 'today', 'b': 'today', 'c': 'today'}

字典的增删改查

(1)增:直接给键赋予对应的值即可

mapping = {}
mapping['color'] = 'black'
print(mapping)
------------------------------
{'color': 'black'}

(2)删

  • 使用语句del dict[key]
  • 使用方法dict.pop(key)
dic = {'a': 'white', 'b': 'black', 'c': 'red'}
print(dic)
dic.pop('a')
print(dic)
del dic['c']
print(dic)
---------------------------------------
{'a': 'white', 'b': 'black', 'c': 'red'}
{'b': 'black', 'c': 'red'}
{'b': 'black'}

(3)改:直接根据key来修改其对应的值

dic = {'a': 'white', 'b': 'black', 'c': 'red'}
print(dic)
dic['a'] = 'yellow'
print(dic)
---------------------------
{'a': 'white', 'b': 'black', 'c': 'red'}
{'a': 'yellow', 'b': 'black', 'c': 'red'}

(4)查

  • dic[key]
  • key in dic: 成员判断,只能使用key去做判断,不能使用value
dic = {'a': 'white', 'b': 'black', 'c': 'red'}
print(dic['c'])
print('a' in dic)
print('c' in dic.keys())
-------------------------
red
True
True

字典常用方法

(1)dict.keys()
生成一个视图,通常使用list(dict.keys())返回字典所有的键,以列表的形式展现

dic = {'a': 'white', 'b': 'black', 'c': 'red'}
print(dic.keys(), type(dic.keys()))
print(list(dic.keys()))
----------------------------------
dict_keys(['a', 'b', 'c']) <class 'dict_keys'>
['a', 'b', 'c']

(2)dict.values()
生成一个视图,可以使用list进行转换,list(dict.values()),返回字典所有的值
(3)dic.items():输出字典的所有元素,原理同上述两种方法,注意如下例子非常重要,后续字典与列表的转换通常会采用类型的结构来处理。

dic = {'a': 'white', 'b': 'black', 'c': 'red', 'name': 'Alice', 'age': 22, 'city': 'Shanghai'}
print(list(dic.items()))
------------------------------------------
[('a', 'white'), ('b', 'black'), ('c', 'red'), ('name', 'Alice'), ('age', 22), ('city', 'Shanghai')]

(4)dict1.update(dict2)
合并两个字典,更改dict1,而不会改变dict2,如果dict1与dict2中有相同的键,那么合并后的键对应的值会被覆盖掉,与此同时最后的输出是无序的

dic1 = {'a': 'white', 'b': 'black', 'c': 'red'}
dic2 = {'name': 'Alice', 'age': 22, 'city': 'Shanghai'}
dic1.update(dic2)
print(dic1)
---------------------------------
{'a': 'white', 'b': 'black', 'c': 'red', 'name': 'Alice', 'age': 22, 'city': 'Shanghai'}

(5)dict.get(key)
直接查看key对应的value值,如果没有相应的key则返回None,添加print参数可以多返回一个值,dic.get(key, print("nothing")),表示如果没有对应的key,则输出nothing

dic = {'a': 'white', 'b': 'black', 'c': 'red', 'name': 'Alice', 'age': 22, 'city': 'Shanghai'}
print(dic.get('city'))
print(dic.get('addr', print('nothing')))
-------------------------------------
Shanghai
nothing
None

字典的键的属性

从字典的定义中我们知道,字典是无序的,且键是不可变的对象,值可以是任意的python对象。

  • 不可变对象:标量类型,元组,字符串,注意列表不是不可变对象
    那么有没有办法能快速识别一个对象是否可以作为字典的键呢??
  • hash函数的使用
hash((1,2,3))
hash('hello')
hash([1,2]):报错,因为列表不可以作为字典的键,除非先将列表转换成元组
print(hash((1,2,3)))
print(hash('hello'))
-----------------------
2528502973977326415
803241608788734770
hash([1,2,3])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-186-35e31e935e9e> in <module>
----> 1 hash([1,2,3])

TypeError: unhashable type: 'list'

字典元素的访问与遍历

for keys in dict:
for key in dict.keys():
for v in dic.values():
for (k, v) in dic.items():
scores = [('语文', 98), ('数学', 120), ('英语', 100)]
dic = dict(scores)

for key in dic:
    print(key)

for value in dic.values():
    print(value)
    
for (k, v) in dic.items():
    print(k, v)
------------------------
语文
数学
英语
98
120
100
语文 98
数学 120
英语 100

集合

集合是一种无序且元素唯一/不重复的容器,可以认为集合类似于字典,但是没有键

创建集合

创建集合可以使用如下两种方法:
(1)通过set函数:set(list)
(2)直接使用花括号:{1,2,3,4,5}

lst = [2, 4, 8, 4, 2, 4, 5]
print(set(lst), type(set(lst)))
set1 = {1, 3, 4, 1, 5}
print(set1)
------------------------
{8, 2, 4, 5} <class 'set'>
{1, 3, 4, 5}

集合的方法

(1)增

a.add(x)

set1 = {1, 2, 3, 4, 5, 9}
set1.add(10)
print(set1) 
>>> {1, 2, 3, 4, 5, 9, 10}

(2)删

a.clear():删除整个集合
a.remove(x):删除集合中x这个元素
a.pop():随机删除一个值
set1 = {1, 2, 3, 4, 5, 9}
set1.clear()
print(set1)  >>> set()
set1 = {1, 2, 3, 4, 5, 9}
set1.remove(5)
print(set1) 
>>> {1, 2, 3, 4, 9}
set1 = {8, 2, 3, 4, 5, 9}
set1.pop()
print(set1)
>>>
{3, 4, 5, 8, 9}

集合的运算

假设有两个集合:a = {1,2,3} b = {1, 77,88}

  • a.union(b):a和b中所有不同的元素 a | b
  • a.update(b):将a集合设置为a和b的并集 a |= b
  • a.intersection(b):两个集合的交集 a & b
  • a.difference(b):在a中不在b中的元素 a - b
  • a.issubset(b):如果a包含于b,则返回True
  • a.issuperset(b):如果a包含b返回True
  • a.isdisjoint(b):a,b没有交集返回True

重点注意:

集合中的元素必须是不可变的,这与字典是类似的,因此如果想要包含列表型元素,必须先转换成元组

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