Python字典和集合編程技巧大總結(jié)
1.如何在列表、字典、集合中根據(jù)條件篩選數(shù)據(jù)?
實(shí)際案例
- 案例1:過濾掉列表[3, 9, -1, 10, 20, -2, …] 中的負(fù)數(shù)
- 案例2:篩出字典{‘lisi’: 79, ‘Jin’: 88, ‘lucy’: 93, … }中值高于90的項(xiàng)
- 案例3:篩出集合{77, 89, 34, 20, 21…}中能被3整除的元素
這類問題比較簡單,通常的做法就是依次迭代列表、字典、集合中的每個(gè)項(xiàng),進(jìn)行條件判斷。
但是在python中,還有更高級(jí)的方法來解決這類問題,并且更簡單高效。
01 案例1:過濾掉列表[3, 9, -1, 10, 20, -2, …] 中的負(fù)數(shù)
方法一:使用 filter 函數(shù)
from random import randint # 使用列表解析生成 -10~10 之間的10個(gè)元素 data = [randint(-10, 10) for _ in range(10)] print('原始列表為:' , data) # filter(function or None, iterable) --> filter object data_o = filter(lambda x: x >= 0, data) for each in data_o: print(each)
方法二:使用列表解析
from random import randint # 使用列表解析生成 -10~10 之間的10個(gè)元素 data = [randint(-10, 10) for _ in range(10)] print('原始列表為:', data) data_o = [x for x in data if x >= 0] print(data_o)
02 案例2:篩出字典{‘lisi’: 79, ‘Jin’: 88, ‘lucy’: 93, … }中值高于90的項(xiàng)
from random import randint # 使用字典解析生成 一個(gè)字典 d ={x: randint(60, 100) for x in range(1, 10)} print(d) d_o = {k: v for k, v in d.items() if v >= 90} print(d_o)
03 案例3:篩出集合{77, 89, 34, 20, 21…}中能被3整除的元素
from random import randint # 使用集合解析生成 -10~10 之間的10個(gè)元素 data = {randint(-10, 10) for _ in range(10)} print('原始集合為:', data) data_o = {x for x in data if x % 3 == 0} print(data_o)
2.如何為元組中的每個(gè)元素命名,提高程序可讀性?
stuents = ('Jim', 16, 'male', 'jim8721@qq.com') name=stuents[0] age=stuents[1] sex= stuents[2] email=stuents[3] print(name, age, sex, email)
01 方法一:定義類似與其他語言的枚舉類型,也就是定義一系列數(shù)值常量
s=stuents = ('Jim', 16, 'male', 'jim8721@qq.com') NAME, AGE, SEX, EMAIL = range(4) name=s[NAME] age=s[AGE] sex= s[SEX] email=s[EMAIL] print(name, age, sex, email)
02 方法二:使用標(biāo)準(zhǔn)庫中 collections.nameedtuple 替代內(nèi)置 tuple
from collections import namedtuple Student = namedtuple('Student', ['name', 'age', 'sex', 'email']) s = Student('Jim', 16, 'male', 'jim182@qq.com') print(s) # Student(name='Jim', age=16, sex='male', email='jim182@qq.com') print(s.name) # 'Jim' print(s.age) # 16 print(s.sex) # 'male' print(s.email) # 'jim182@qq.com'
3.如何統(tǒng)計(jì)序列中元素的出現(xiàn)頻度?
案例1:
方法一:傳統(tǒng)方法
from random import randint # 隨機(jī)生成一個(gè)列表 data = [randint(0, 20) for _ in range(30)] # 以列表中的值為字典的鍵,0為字典的值建立字典 c = dict.fromkeys(data, 0) # 依次遍歷列表,遇到一個(gè)元素,就把字典中對(duì)應(yīng)的鍵的值加1 for x in data: c[x] += 1 print(c)
方法二:使用 collections.Counter 對(duì)象
將序列傳入 Counter 的構(gòu)造器,得到 Counter 對(duì)象是元素頻率的字典
Counter.most_common(n) 方法得到頻率最高的 n 個(gè)元素的列表
from random import randint from collections import Counter # 隨機(jī)生成一個(gè)列表 data = [randint(0, 20) for _ in range(30)] c = Counter(data) # 得到的 c 就是一個(gè)collections.Counter類型的數(shù)據(jù),和方法 一 結(jié)果一樣 # 用法與字典一樣,例如 c[2] , 就是得到 鍵為2 對(duì)應(yīng)的值 print(c) # 另外,還可以使用 most_common() 方法得到 出現(xiàn)頻率最高的幾個(gè)鍵和值 print(c.most_common(3)) # 輸出前3名
案例2:
from collections import Counter import re with open('./test.txt', 'r') as f: txt = f.read() # 使用 正則表達(dá)式 對(duì)文本進(jìn)行切割,按照 非字母字符 進(jìn)行切割 l1 = re.split('\W+', txt) c = Counter(l1) # 得到頻率最高的10個(gè)單詞 print(c.most_common(10))
4.如何根據(jù)字典中值的大小,對(duì)字典中的項(xiàng)排序?
01 方法一:使用zip將字典數(shù)據(jù)轉(zhuǎn)換為元組
from random import randint # 生成隨機(jī)字典 d = {x:randint(60,100) for x in 'xyzabc'} print(d) # 把值放在前面,鍵放在后面,構(gòu)成元組,每個(gè)元組為列表的一個(gè)項(xiàng) # 得到的結(jié)果為 [(74, 'z'), (80, 'y')...]形式 list1 = zip(d.values(), d.keys()) # 然后對(duì)得到的列表進(jìn)行排序,就會(huì)以列表中的元組的第一項(xiàng)排序,相同時(shí)再比較第二項(xiàng) print(sorted(list1))
02 方法二:使用 sorted 函數(shù)的 key 參數(shù)
from random import randint # 生成隨機(jī)字典 d = {x:randint(60,100) for x in 'xyzabc'} print(d) # d.items() 也是一個(gè)元組的列表,只是元組中鍵在前,值在后 # 使用 key 參數(shù)設(shè)置以第二項(xiàng) (值)作為排序依據(jù) print(sorted(d.items(), key = lambda x: x[1]))
5.如何快速找到多個(gè)字典中的公共鍵?
01 方法一:傳統(tǒng)方法,依次遍歷
from random import randint, sample # 隨機(jī)產(chǎn)生 3 場球賽的 進(jìn)球人和數(shù) s1 = {x: randint(1,4) for x in sample('abcdefg',randint(3,6))} s2 = {x: randint(1,4) for x in sample('abcdefg',randint(3,6))} s3 = {x: randint(1,4) for x in sample('abcdefg',randint(3,6))} print(s1) print(s2) print(s3) # 傳統(tǒng)方法 res = [] for k in s1: if k in s2 and k in s3: res.append(k) print(res)
02 方法二:利用集合(set)的交集操作
利用字典的keys() 方法,得到一個(gè)字典的 keys 的集合
取所有字典的 keys 的集合的交集
from random import randint, sample # 隨機(jī)產(chǎn)生 3 場球賽的 進(jìn)球人和數(shù) s1 = {x: randint(1,4) for x in sample('abcdefg',randint(3,6))} s2 = {x: randint(1,4) for x in sample('abcdefg',randint(3,6))} s3 = {x: randint(1,4) for x in sample('abcdefg',randint(3,6))} print(s1) print(s2) print(s3) print(s1.keys() & s2.keys() & s3.keys())
6.如何讓字典保持有序?
d = dict() d['Jim']=(1.35) d['Leo']=(2,37) d['Bob']=(3,45) for k in d: print(k)
方法:使用collections.OrderedDict
以O(shè)rderedDict替代字典Dict,依次將選手成績存入OrderedDict。
from collections import OrderedDict d = OrderedDict() d['Jim']=(1.35) d['Leo']=(2,37) d['Bob']=(3,45) for k in d: print(k)
7.如何實(shí)現(xiàn)用戶的歷史記錄功能?
原始代碼如下:
from random import randint N = randint(0, 100) def guess(k): if k == N: print('猜對(duì)了') return True elif k < N: print('猜小了') else: print('猜大了') return False while True: line = input("please input a number:") if line.isdigit(): k = int(line) if guess(k): break
我們希望保存最近 5 次猜的數(shù)字,之前的就被刪除
解決方案:
使用容量為 n (本例中 n=5) 的隊(duì)列存儲(chǔ)歷史記錄
使用標(biāo)準(zhǔn)庫中的 deque,它是一個(gè)雙端循環(huán)隊(duì)列
from random import randint from collections import deque history = deque([], 5) N = randint(0, 100) def guess(k): if k == N: print('猜對(duì)了') return True elif k < N: print('猜小了') else: print('猜大了') return False while True: line = input("please input a number:") if line.isdigit(): k = int(line) history.append(k) if guess(k): break elif line == 'history' or line == 'h?': print(history)
若我們還希望 程序下次運(yùn)行時(shí),可以查看之前的歷史記錄,就需要將 隊(duì)列對(duì)象 保存到磁盤,可以使用 pickle
pickle 可以將任意類型的數(shù)據(jù)(包括 數(shù)字型、列表、字典、字符串等)保存到磁盤文件,在需要的時(shí)候還可以正常讀回為原數(shù)據(jù)
解決方案:程序退出前,可以使用 pickle 將隊(duì)列對(duì)象存入文件,再次運(yùn)行程序時(shí)將其導(dǎo)入
pickle 的用法:
寫數(shù)據(jù):
import pickle data = [1, 2, 3, 4] with open('data.dat', 'wb') as f: pickle.dump(data, f)
讀數(shù)據(jù):
import pickle with open('data.dat', 'rb') as f: data = pickle.load(f) print(data)
總結(jié)
今天就是借助一些基礎(chǔ)的代碼案例,給大家分享講解Python中的字典和集合在實(shí)際編程中的一些使用技巧,希望對(duì)您有所幫助!
到此這篇關(guān)于Python字典和集合編程技巧的文章就介紹到這了,更多相關(guān)Python字典和集合技巧內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)對(duì)百度云的文件上傳(實(shí)例講解)
下面小編就為大家?guī)硪黄狿ython實(shí)現(xiàn)對(duì)百度云的文件上傳(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10Python 編碼處理-str與Unicode的區(qū)別
本文主要介紹Python 編碼處理的問題,這里整理了相關(guān)資料,并詳細(xì)說明如何處理編碼問題,有需要的小伙伴可以參考下2016-09-09在python中實(shí)現(xiàn)對(duì)list求和及求積
今天小編就為大家分享一篇在python中實(shí)現(xiàn)對(duì)list求和及求積,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11Tensorflow中批量讀取數(shù)據(jù)的案列分析及TFRecord文件的打包與讀取
這篇文章主要介紹了Tensorflow中批量讀取數(shù)據(jù)的案列分析及TFRecord文件的打包與讀取,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06使用jupyter notebook將文件保存為Markdown,HTML等文件格式
這篇文章主要介紹了使用jupyter notebook將文件保存為Markdown,HTML等文件格式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04