1.如何在字典,序列,集合中根據條件篩選資料
實體案例:
- 過濾掉串列
[3,9,-1...]中的負數,
這里要注意:不管你是為了Python就業還是興趣愛好,記住:專案開發經驗永遠是核心,如果你沒有2020最新python入門到高級實戰視頻教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,里面很多新python教程專案,還可以跟老司機交流討教!
解決方案: 串列決議[x for x in data if x >=0]
l=[randint(-10,10) for _in range(10)]
[x for x in l if x>=0]
g=filter(lambda x:x>=0,l)
next(g)
list(g)
復制代碼
實體案例:
- 篩出字典
{'LiLei':79,'jim':88,'Lucy':92...}中值高于90的項
解決方案: 字典決議 {k:v for k,v in d.items() if v >90}
d={'student%d' % i:randint(50,100) for i in range(1,21)}
{k:v for k,v in d.items if v>=90}
g=filter(lambda item:item[1]>=90,d.items())
list(g)
dict(g)
復制代碼
實體案例:
- 篩出集合
{77,89,32,20...}中能被3整除的元素 -
解決方案: 串列決議
[x for x in data if x % 3==0]
s={randint(0,20) for _ in range(20)}
{x for x in s if x % 3==0}
復制代碼
2. 如何為元組中的每個元素命名提高程式的可讀性
實體案例:
學生系統中資料為固定格式:(名字,年齡,性別,郵箱)
('jim',16''male','[email protected]')
('LiLei',17''male','[email protected]')
('Lucy',16''female','[email protected]')
訪問時我們使用索(index)訪問,大量索引降低程式可讀性.
解決方案:
方案1:定義一系列數值常量或列舉型別
方案2: 使用標準庫中collections.namedtuple替代內置tuple
from enum import IntEnum
NAME,AGE,SEX,EMAIL=range(4)
s=('jim',16''male','[email protected]')
class StudentEnum(IntEnum):
NAME=0
AGE=1
SEX=2
EMAIL=3
StudentEnum.NAME
s[StudentEnum.NAME]
isinstance(StudentEnum.NAME,int)
復制代碼
解決方案2:
from collections import namedtuple
Student=namedtuple('Student',['name','age','sex','email'])
s2=Student('jim',16''male','[email protected]')
s2
Student(name='jim',age=16,sex='male',email='[email protected]')
isinstance(s2,tuple)
復制代碼
3.如何根據字典中值得大小,對字典中的項排序
實體案例:
某班英語成績以字典形式存盤為:
{
'LiLei':79,
'jim' :88,
'Lucy' :92,
..
}
復制代碼
如何根據成績高低,計算學生排名
解決方案:將字典中的各項轉換為元組,使用內置函式sorted排序
方案1:將字典中的項轉化為(值,鍵)元組.(串列決議或zip)
from random import randint
d={k:randint(60,100) for k in 'abcdefg'}
l=[(v,k) for k in d.items()]
sorted(l,reverse=True)
d.items()
p=sorted(d.items(),key=lambda item:item[1],reverse=True)
list(enumerate(p))
list(enumerate(p,1))
for i (k,v) item in enumerate(p,1):
print(i,k,v)
d[k]=(i,v)
字典決議:{k:(i,v) for i (k,v) item in enumerate(p,1)}
復制代碼
4.如何統計序列中元素出現的頻度
實體案例:
1.某隨機序列[12,5,6,4,6,5,5,7]中,找到出現次數最高的3個元素,它們出現次數是多少?
2.對于某英文文章,進行詞頻統計,找到出現次數最高的10個單詞,他們出現次數是多少?
解決方案:
方案1.將序列轉換成字典{元素:頻度},根據字典中的值排序,
from random import randint
data=https://www.cnblogs.com/chengxuyuanaa/p/[randint(0,20) for _ in range(30)]
d=dict.fromkeys(data,0)
for x in data:
d[x] +=1
sorted(((v,k) for k, v in d.items()),reverse=True)[:3]
import heapq
heapq.nlargest(3,(v,k) for k,v in d.items)
復制代碼
方案2:使用標準庫collections中的Counter物件
from collections import Counter
data
c=Counter(data)
c.most_common(3)
txt=open('example.txt').read()
import re
word_list=re.split('\W+',txt)
c2=Counter(word_list)
c2.most_common(10)
復制代碼
5.如何快速找到多個字典中的公共鍵
實體案例:
西班牙足球聯賽,每輪隊員進球統計:
第1輪:{'蘇亞雷斯':1,'梅西':2,'本澤馬':1,...}
第1輪:{'蘇亞雷斯':2,'C羅':1,'格里斯曼':2,...}
第1輪:{'蘇亞雷斯':1,'托雷斯':2,'貝爾':1,...}
統計出前N輪每場比賽都有進球的球員.
解決方案:
方案1.
from random import randint,simple
simple('abcdefgh',3)
simple('abcdefgh',randint(3,6))
d1={k:randint(1,4) for k in sample('abcdefgh',randint(3,6))}
d1
d2={k:randint(1,4) for k in sample('abcdefgh',randint(3,6))}
d3={k:randint(1,4) for k in sample('abcdefgh',randint(3,6))}
for k in d1:
if k in d2 and k in d3:
print(k)
[k for k in d1 if k in d2 and k in d3]
d1=[d1,d2,d3]
[k for k in d1[0] if all(map(lambda d: k in d,d1[1:]))]
復制代碼
解決方案:
利用集合(set)的交集操作 step1:使用字典的keys()方法,得到一個keys的集合 step2:使用map函式,得到每個字典的keys的集合 step3:使用reduce函式,取所有字典的keys集合的交集
s1=d1.keys()
s2=d2.keys()
s1 & s2
from functools import reduce
reduce(lambda a,b:a*b,range(1,11))
map(dict.keys,d1)
reduce(lambda a,b:a&b map(dict.keys,d1)
復制代碼
6.如何讓字典保持有序
實體案例:
某編程比賽系統, 對參賽選手編程解題進行計時,選手晚上比賽后,把該選手解題用時記錄到字典中,以便賽后按選手名查詢成績. {'LiLei':(2,43),'HanMeiMei':(5,52),'jim':(1,39)...} 比賽結束后,需按排名順序依次列印選手成績,如何實作?
解決方案:
使用標準庫collection中的OrderedDict 以OrderedDict替代內置字典Dict,依次將選手成績存入OrderedDict
d={}
from collections import OrderdDict
od = OrderedDict()
od=['c']
od=['b']
od=['a']
od.keys()
players = list('abcdefgh')
from random import shuffle
shuffle(players)
players
od=OrderedDict()
for i, p in enumerate(players,1)
od[p] = i0
od
def query_by_name(d,name):
return d[name]
query_by_name(od,'c')
復制代碼
7.如何實作用戶的歷史記錄功能
研討問題:
如何實作用戶的歷史記錄功能(最多n條)?
實體案例:
很多應用程式都有瀏覽用戶的歷史記錄功能,例如:
1.瀏覽器可以查看最近瀏覽的網頁
2.視頻播放器可以查看最近播放過的視頻檔案
3.Shell可以查看用戶輸入過的命令
現在我們制作了一個簡單的猜數字游戲 如何添加歷史記錄,顯示用戶最近猜過的數字?
from random import randint
def guess(n,k):
if n ==K:
print('猜對了,這個數字是%d.' %k)
return True
if n<k:
print('猜大了,比%d小.' %k)
elif n>k:
print('猜小了,比%d大,'%k)
return False
def main():
n = randint(1,100)
i =1
while True:
line= input('[%d] 請輸入一個數字:' %d)
if line.isdight():
k = int(line)
i += 1
if guess(n,k):
break
elif line == 'quit':
break
if __name__=='__main__':
main()
復制代碼
解決方案:
使用容量為n的佇列存盤歷史記錄 使用標準資料庫collections中的deque,它是一個雙端佇列 使用pickle模塊將歷史記錄存盤到硬碟,以便下次啟動使用
from collections import deque
deque([],5)
q.append(1)
q.append(2)
q.append(3)
q.append(4)
q.append(5)
q
deque([1,2,3,4,5],maxlen=5)
q.append(6)
q
deque([2,3,4,5,6],maxlen=5)
from random import randint
from collections import deque
def guess(n,k):
if n ==K:
print('猜對了,這個數字是%d.' %k)
return True
if n<k:
print('猜大了,比%d小.' %k)
elif n>k:
print('猜小了,比%d大,'%k)
return False
def main():
n = randint(1,100)
i =1
hq=deque([],5)
while True:
line= input('[%d] 請輸入一個數字:' %d)
if line.isdight():
k = int(line)
hq.append(k)
i += 1
if guess(n,k):
break
elif line == 'quit':
break
elif line=='h?'
print(list(hq))
if __name__=='__main__':
main()
import pickle
pickle.dump
q
deque([2,3,4,5,6],maxlen=5)
pickle.dump(q,open('save.pkl','wb'))
ed save.pkl
q2=pickle.load(open('save.pk1','rb'))
復制代碼
本文講解了串列,字典集合根據條件篩選資料,根據字典的值得大小進行排序,統計序列中出現元素的頻度,如何實作用戶的歷史記錄功能,
最后注意:不管你是為了Python就業還是興趣愛好,記住:專案開發經驗永遠是核心,如果你沒有2020最新python入門到高級實戰視頻教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,里面很多新python教程專案,還可以跟老司機交流討教!
本文的文字及圖片來源于網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/153384.html
標籤:Python
下一篇:python dic字典排序
