python的字典与集合
一、集合
集合(set)是一個(gè)無序的不重復(fù)元素序列。1,2,3,4,1,2,3 = 1,2,3,4
1.集合的創(chuàng)建
# 1. 集合的創(chuàng)建 s = {1, 2, 3, 1, 2, 3} # {1, 2, 3} print(s, type(s)) # 注意點(diǎn)1: 集合的元素必須時(shí)不可變數(shù)據(jù)類型。 # s = {1, 2, 3, [1, 2, 3]} # print(s, type(s)) # 注意點(diǎn)2:空集合不能使用{}, 而要使用set() # s = {} # print(s, type(s)) s = set() print(s, type(s))代碼運(yùn)行結(jié)果:
2. 集合的特性
- 不支持+,*, index, slice(因?yàn)榧蠠o序不重復(fù)的)
- 支持in和not in
3. 集合的常用操作
1).增加
# add: 添加單個(gè)元素 # update: 添加多個(gè)元素 s = {1, 2, 3} s.add(100) print(s) s = {1, 2, 3} s.update({4, 5, 6}) print(s)代碼運(yùn)行結(jié)果:
2).刪除
# remove: 如果元素存在,刪除,否則報(bào)錯(cuò) # discard: 如果元素存在,刪除,否則do nothing # pop: 隨機(jī)刪除元素,集合為空則報(bào)錯(cuò) s = {1, 2, 3} s.remove(3) print(s) s = {1, 2, 3} s.discard(100) print(s) s = {1, 66, 2,99, 78, 3} s.pop() print(s)代碼運(yùn)行結(jié)果:
3).查看
# 差集: s1 - s2 # 交集: s1 & s2 # 對(duì)稱差分: s1 ^ s2 # 并集: s1 | s2 s1 = {1, 2, 3} s2 = {1, 2} print(s1 - s2) # {3} print(s1 & s2) # {1, 2} s1 = {1, 2, 3} s2 = {1, 2, 4} print(s1 ^ s2) # {3, 4}, {1, 2, 3, 4} - {1, 2} = {3,4} print(s1 | s2) # {1, 2, 3, 4} print(s1.issubset(s2)) # False print(s1.isdisjoint(s2)) # False代碼運(yùn)行結(jié)果:
4.集合練習(xí)題
明明想在學(xué)校中請(qǐng)一些同學(xué)一起做一項(xiàng)問卷調(diào)查,為了實(shí)驗(yàn)的客觀性,他先用計(jì)算機(jī)生成了N個(gè)1到1000之間的隨機(jī)整數(shù)(N≤1000),對(duì)于其中重復(fù)的數(shù)字,只保留一個(gè),把其余相同的數(shù)去掉,不同的數(shù)對(duì)應(yīng)著不同的學(xué)生的學(xué)號(hào)。然后再把這些數(shù)從大到小排序,按照排好的順序去找同學(xué)做調(diào)查。請(qǐng)你協(xié)助明明完成“去重”與“排序”的工作(同一個(gè)測(cè)試用例里可能會(huì)有多組數(shù)據(jù),希望大家能正確處理)。
import random N = int(input("請(qǐng)輸入隨機(jī)數(shù)個(gè)數(shù):")) s = set() for item in range(1,N):s.add(random.randint(1,1000)) s = sorted(s,reverse=True) print(s)代碼運(yùn)行結(jié)果:
5.拓展: frozenset不可變的集合
frozenset 是 set 的不可變版本,因此 set 集合中所有能改變集合本身的方法(如 add、remove、discard、xxx_update 等),frozenset 都不支持;set 集合中不改變集合本身的方法,fronzenset 都支持。
frozenset 的這些方法和 set 集合同名方法的功能完全相同。frozenset 的作用主要有兩點(diǎn):
- 當(dāng)集合元素不需要改變時(shí),使用 frozenset 代替 set 更安全。
- 當(dāng)某些 API 需要不可變對(duì)象時(shí),必須用 frozenset 代替set。比如 dict 的 key 必須是不可變對(duì)象,因此只能用 frozenset;再比如 set 本身的集合元素必須是不可變的,因此 set 不能包含 set,set 只能包含 frozenset。
代碼運(yùn)行結(jié)果:
二、字典
字典是另一種可變?nèi)萜髂P?#xff0c;且可存儲(chǔ)任意類型對(duì)象。
鍵一般是唯一的,如果重復(fù)最后的一個(gè)鍵值對(duì)會(huì)替換前面的,值不需要唯一。
1.字典的創(chuàng)建dict
# key-value對(duì)或者鍵值對(duì) d = {"name":"sun","age":18,"city":"西安"} print(d,type(d)) d = {} print(d,type(d))代碼運(yùn)行結(jié)果:
2.字典的特性
# 不支持+,*, index, slice(因?yàn)榧蠠o序不重復(fù)的) # 支持in和not in d = {"name":"sun","age":18,"city":"西安"} print('name' in d) #Ture 成員操作符判斷的是key值是否存在 print("sun" in d) #False代碼運(yùn)行結(jié)果:
3.字典的常用方法
1.查看
- 查看所有:keys,values,items
- 查看局部:d[key],d.get(key),d.get(key,default-value)
代碼運(yùn)行結(jié)果:
2.增加和修改
# 2.增加和修改 d = {"name":"sun","age":18} d['city'] = "西安" # key不存在就添加 print(d) d['city'] = "成都" # key存在就修改 print(d) d = {"name":"sun","age":18} d.setdefault('city',"西安") # key不存在就添加 print(d) d.setdefault('city','北京') #key存在do nothing print(d)代碼運(yùn)行結(jié)果:
3.刪除
# 3.刪除 d = {'name':'sun','age':18} d.pop('name') print(d) d = {'name':'sun','age':18} del d['age'] print(d)代碼運(yùn)行結(jié)果:
4.遍歷字典(for)
# 4.遍歷字典(for) d = {'name':'sun','age':18,'city':'西安'} # 默認(rèn)情況下,字典只會(huì)遍歷key值 for item in d:print(item)#如果遍歷字典地key和value值 for item in d.items():print(item) for key,value in d.items():print(f"key={key},value={value}")代碼運(yùn)行結(jié)果:
4.練習(xí)題
兩數(shù)之和力扣鏈接
直接在力扣上作答即可
5.拓展:defaultdict
collections.defaultdict類,本身提供了默認(rèn)值的功能, 默認(rèn)值可以是整形,列表,集合等.
defaultdict 是 dict 的子類。但它與 dict 最大的區(qū)別在于,如果程序試圖根據(jù)不存在的 key 訪問 value,會(huì)引發(fā) KeyError 異常;而 defaultdict 提供default_factory 屬性,該為不存在的 key 來自動(dòng)生成生成默認(rèn)的 value。
需求:
我們想要一個(gè)能將鍵(key)映射到多個(gè)值的字(即所謂的一鍵多值字典)
解決方案:
1). 字典是一種關(guān)聯(lián)容器,每個(gè)鍵都映射到一個(gè)單獨(dú)的值上。如果想讓鍵映射到多個(gè)值,需要將這些多個(gè)值保存到容器(列表或者集合)中。
2). 利用collections模塊中的defaultdict類自動(dòng)初始化第一個(gè)值,這樣只需關(guān)注添加元素.
代碼運(yùn)行結(jié)果:
練習(xí):無重復(fù)字符的最長字串
總結(jié)
以上是生活随笔為你收集整理的python的字典与集合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python的列表和元组
- 下一篇: python持久化存储文件操作