欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python字典和集合編程技巧大總結(jié)

 更新時(shí)間:2023年09月27日 08:53:38   作者:Token_w  
這篇文章主要給大家介紹了關(guān)于Python字典和集合編程技巧的相關(guān)資料,Python中的字典和集合是兩種非常常用的數(shù)據(jù)結(jié)構(gòu),它們可以幫助我們更方便地管理和操作數(shù)據(jù),需要的朋友可以參考下

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í)例講解)

    Python實(shí)現(xiàn)對(duì)百度云的文件上傳(實(shí)例講解)

    下面小編就為大家?guī)硪黄狿ython實(shí)現(xiàn)對(duì)百度云的文件上傳(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • Python 編碼處理-str與Unicode的區(qū)別

    Python 編碼處理-str與Unicode的區(qū)別

    本文主要介紹Python 編碼處理的問題,這里整理了相關(guān)資料,并詳細(xì)說明如何處理編碼問題,有需要的小伙伴可以參考下
    2016-09-09
  • 在python中實(shí)現(xiàn)對(duì)list求和及求積

    在python中實(shí)現(xiàn)對(duì)list求和及求積

    今天小編就為大家分享一篇在python中實(shí)現(xiàn)對(duì)list求和及求積,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Python實(shí)現(xiàn)圖像添加水印的方法

    Python實(shí)現(xiàn)圖像添加水印的方法

    在日常圖像處理中,為圖片添加水印是一項(xiàng)常見任務(wù),本文主要介紹了Python實(shí)現(xiàn)圖像添加水印的方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • python中異常的傳播詳解

    python中異常的傳播詳解

    大家好,本篇文章主要講的是python中異常的傳播詳解,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • Tensorflow中批量讀取數(shù)據(jù)的案列分析及TFRecord文件的打包與讀取

    Tensorflow中批量讀取數(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等文件格式

    這篇文章主要介紹了使用jupyter notebook將文件保存為Markdown,HTML等文件格式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • 詳解python中的線程與線程池

    詳解python中的線程與線程池

    這篇文章主要介紹了python線程與線程池,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • python 已知三條邊求三角形的角度案例

    python 已知三條邊求三角形的角度案例

    這篇文章主要介紹了python 已知三條邊求三角形的角度案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • 基于python 開立方的注意事項(xiàng)說明

    基于python 開立方的注意事項(xiàng)說明

    這篇文章主要介紹了基于python 開立方的注意事項(xiàng)說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03

最新評(píng)論