1.1.如何在列表中根據條件篩選數據 1.2.如何在列表中根據條件篩選數據 1.3.如何在集合中根據條件篩選數據 1.4.如何為元祖中的每個元素命名,提高程式可讀性 如下元祖,通過函數判斷年齡和性別,但是這樣代碼可讀性很差,別人並不知道student[1],student[2]代表什麼意思。如何解決 ...
1.1.如何在列表中根據條件篩選數據
# 1.1.如何在列表中根據條件篩選數據 data = [-1, 2, 3, -4, 5] #篩選出data列表中大於等於零的數據 #第一種方法,不推薦 res1 = [] for x in data: if x >= 0: res1.append(x) print(res1) #第二種用列表解析,推薦使用 res2 = [ x for x in data if x >= 0] print(res2) #第三種用filter函數 res3 = list(filter(lambda x : x>= 0,data)) print(res3)
1.2.如何在字典中根據條件篩選數據
# 1.2.如何在字典中根據條件篩選數據 from random import randint #創建學生字典,學號為1~20,分數為50~100隨機 d = {'student%d'% i: randint(50,100) for i in range(1,21)} print(d) #過濾出分數為90的學生字典 #第一種方法 d1 = {k:v for k,v in d.items() if v >= 90} print(d1) #第二種方法 d2 = dict(filter(lambda item:item[1] >= 90, d.items())) print(d2)
1.3.如何在集合中根據條件篩選數據
# 1.3.如何在集合中根據條件篩選數據 from random import randint s = {randint(0,20) for _ in range(20)} print(s) #篩選出能被3整除的數 s1 = {x for x in s if x % 3 == 0} print(s1)
1.4.如何為元祖中的每個元素命名,提高程式可讀性
如下元祖,通過函數判斷年齡和性別,但是這樣代碼可讀性很差,別人並不知道student[1],student[2]代表什麼意思。如何解決呢
def func(student): if student[1] < 18 : pass if student[2] == 'male': pass student = ('derek',22,'male','[email protected]') func(student)
方案一:定義枚舉類型
#1.4..如何為元祖中的每個元素命名,提高程式可讀性 def func(student): if student[1] < 18 : pass if student[2] == 'male': pass s1 = ('derek',22,'male','[email protected]') #第一種:使用枚舉 from enum import IntEnum class StudentEnum(IntEnum): NAME = 0 AGE = 1 SEX = 2 EMAIL = 3 print(s1[StudentEnum.NAME]) print(s1[StudentEnum.AGE])
方案二:使用標準庫中collections.namedtuple替代內置tuple
#1.4..如何為元祖中的每個元素命名,提高程式可讀性 def func(student): if student[1] < 18 : pass if student[2] == 'male': pass s1 = ('derek',22,'male','[email protected]') #第一種:使用枚舉 from enum import IntEnum class StudentEnum(IntEnum): NAME = 0 AGE = 1 SEX = 2 EMAIL = 3 print(s1[StudentEnum.NAME]) print(s1[StudentEnum.AGE]) #第二種:使用標準庫中collections.namedtuple替代內置tuple from collections import namedtuple Student = namedtuple('student',['name','age','sex','email']) s2 = Student('derek',22,'male','[email protected]') print(s2[0]) #derek # 可以通過s2.name獲取姓名 print(s2.name) #derek
1.5.如何根據字典中值的大小,對字典中的項進行排序
第一種方法:列表解析
# 1.5.如何根據字典中值的大小,對字典中的項進行排序 from random import randint d = {k: randint(60, 100) for k in 'abcdefg'} print(d) #第一種方法:使用列表解析或者zip()函數,把字典的keys和values反轉過來 list1 = [(v,k) for k,v in d.items()] #或者使用zip()函數 # list2 = list(zip(d.values(),d.keys())) print(list1) list1 = sorted(list1,reverse=True) print(list1)
第二種使用sorted
# 1.5.如何根據字典中值的大小,對字典中的項進行排序 from random import randint d = {k: randint(60, 100) for k in 'abcdefg'} print(d) #第一種方法:使用列表解析或者zip()函數,把字典的keys和values反轉過來 list1 = [(v,k) for k,v in d.items()] #或者使用zip()函數 # list2 = list(zip(d.values(),d.keys())) list1 = sorted(list1,reverse=True) #第二種方法:使用sorted排序 p = sorted(d.items(),key=lambda item:item[1],reverse=True) print(p) #[('a', 97), ('b', 93), ('d', 93), ('e', 92), ('f', 76), ('c', 66), ('g', 61)] #對分數添加一個排名 d = {k:(i,v) for i, (k,v) in enumerate(p,1)} print(d) #{'g': (1, 97), 'd': (2, 92), 'f': (3, 91), 'c': (4, 79), 'a': (5, 78), 'e': (6, 67), 'b': (7, 64)}
1.6.如何統計序列中元素的頻度
# 1.6如何統計序列中元素的頻度 from random import randint from collections import Counter data = [randint(1,5) for _ in range(1,20)] print(data) #[5, 2, 1, 2, 5, 3, 1, 1, 1, 4, 2, 5, 3, 2, 3, 5, 1, 2, 5] #計算頻度最高的是三個數 c = Counter(data) print(c.most_common(3)) #[(1, 5), (3, 4), (2, 4)]
1.7.如何快速找到多個字典中的公共鍵
# 1.7.如何快速找到多個字典中的公共鍵 from random import randint,sample from functools import reduce d1 = {k:randint(1,4) for k in sample('abcdefgh',randint(3,6))} 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))} #1.使用字典的keys()方法,得到一個字典keys的集合 #2.使用map函數,得到每個字典keys的集合 #3.使用reduce,取所有字典keys集合的交集 dl = [d1,d2,d3] #找到三個字典中相同的keys result = reduce(lambda a,b: a & b, map(dict.keys, dl)) print(result)
1.8.如何讓字典保持有序
# 1.8.如何讓字典保持有序 from collections import OrderedDict from itertools import islice d = OrderedDict() d['e'] = 5 d['d'] = 4 d['c'] = 3 d['b'] = 2 d['a'] = 1 print(d) #OrderedDict([('e', 5), ('d', 4), ('c', 3), ('b', 2), ('a', 1)]) #OrderedDict字典,在迭代操作時,它會保持元素被插入時的順序 def query_by_order(d, a, b =None): if b is None: b = a + 1 return list(islice(d,a,b)) #第五個key res1 = query_by_order(d,4) print(res1) #['a'] #第二個和第三個key res2 = query_by_order(d,1,3) print(res2) #['d', 'c']
1.9.如何實現用戶的歷史記錄功能
使用容量為n的隊列存儲歷史記錄
- 使用deque雙端迴圈隊列存儲歷史記錄(deque是保存到記憶體中,下次啟動歷史記錄會消失)
- 如果想保存到硬碟中,使用pickle模塊,以便下次啟動使用
# 1.9如何實現用戶的歷史記錄功能 from random import randint from collections import deque import pickle 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]請輸入一個數字:' % i) if line.isdigit(): k = int(line) hq.append(k) i += 1 if guess(n, k): break elif line == 'quit': break elif line == 'history': print(hq) if __name__ == '__main__': main() #結果 [1]請輸入一個數字:1 猜小了,比1大 [2]請輸入一個數字:2 猜小了,比2大 [3]請輸入一個數字:3 猜小了,比3大 [4]請輸入一個數字:history deque([1, 2, 3], maxlen=5) [4]請輸入一個數字: