Python字典和集合編程技巧大總結(jié)
1.如何在列表、字典、集合中根據(jù)條件篩選數(shù)據(jù)?
實(shí)際案例
- 案例1:過(guò)濾掉列表[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整除的元素
這類(lèi)問(wèn)題比較簡(jiǎn)單,通常的做法就是依次迭代列表、字典、集合中的每個(gè)項(xiàng),進(jìn)行條件判斷。
但是在python中,還有更高級(jí)的方法來(lái)解決這類(lèi)問(wèn)題,并且更簡(jiǎn)單高效。
01 案例1:過(guò)濾掉列表[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 方法一:定義類(lèi)似與其他語(yǔ)言的枚舉類(lèi)型,也就是定義一系列數(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)庫(kù)中 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類(lèi)型的數(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 場(chǎng)球賽的 進(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 場(chǎng)球賽的 進(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,依次將選手成績(jī)存入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)用戶(hù)的歷史記錄功能?
原始代碼如下:
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)庫(kù)中的 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ì)象 保存到磁盤(pán),可以使用 pickle
pickle 可以將任意類(lèi)型的數(shù)據(jù)(包括 數(shù)字型、列表、字典、字符串等)保存到磁盤(pán)文件,在需要的時(shí)候還可以正常讀回為原數(shù)據(jù)
解決方案:程序退出前,可以使用 pickle 將隊(duì)列對(duì)象存入文件,再次運(yùn)行程序時(shí)將其導(dǎo)入
pickle 的用法:
寫(xiě)數(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ī)?lái)一篇Python實(shí)現(xiàn)對(duì)百度云的文件上傳(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
Python 編碼處理-str與Unicode的區(qū)別
本文主要介紹Python 編碼處理的問(wèn)題,這里整理了相關(guān)資料,并詳細(xì)說(shuō)明如何處理編碼問(wèn)題,有需要的小伙伴可以參考下2016-09-09
在python中實(shí)現(xiàn)對(duì)list求和及求積
今天小編就為大家分享一篇在python中實(shí)現(xiàn)對(duì)list求和及求積,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
Tensorflow中批量讀取數(shù)據(jù)的案列分析及TFRecord文件的打包與讀取
這篇文章主要介紹了Tensorflow中批量讀取數(shù)據(jù)的案列分析及TFRecord文件的打包與讀取,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
使用jupyter notebook將文件保存為Markdown,HTML等文件格式
這篇文章主要介紹了使用jupyter notebook將文件保存為Markdown,HTML等文件格式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
基于python 開(kāi)立方的注意事項(xiàng)說(shuō)明
這篇文章主要介紹了基于python 開(kāi)立方的注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03

