一、在list\dict\set中進行篩選
在list中篩選:
方法一:[x for x in list if x>10] # 效率更高
方法二:filter(lambda x :x>10,list) # lambda 定義一個匿名函數在dict中篩選:
{k: v for k, v in dict.items() if v > 85} # 後面添加條件在set中篩選:
{s for s in set if s>10}
# set() 函數創建一個無序不重複元素集,可進行關係測試,刪除重複數據,還可以計算交集、差集、並集等。
# 語法:class set([iterable])
二、爲元組中每個元素命名,提高可讀性
方法一:宏定義方法
student = ('litaifa','40','male')
NAME, AGE, SEX = xrange(3)
print student[NAME]
方法二:命名元組方法 namedtuple
collections.namedtuple(typename, field_names, verbose=False, rename=False)
返回一個命名元祖子類typename,其中參數的意義如下:
typename,:此元組的名稱; field_names:
元祖中元素的名稱(類似於c結構體中的age等),此字段有多種表達方式,見例子;
rename:如果元素名稱中含有python的關鍵字,則必須設置爲rename=True,具體見下面; verbose:默認就好;
實例:
import collections
#其中field_names 有多種表達方式,如下
student=collections.namedtuple('student','name age sex') # 三種方法,選其中一種
student=cpllections.namedtuple('student',['name','age','sex'])
student=cpllections.namedtuple('student','name,age,sex')
spark=student(name='sunYang',age=20,sex='male')
print(spark) # student(name='sunYang', age=20, sex='male')
print("spark's name is %s" % spark.name) # spark's name is sunYang
print("%s is %d years old %s" % spark) # sunYang is 20 years old male
三、dict\list排序
list排序:
x=[1,3,5,7,10,5,3]
方法一
x.sort(lambda a, b: a - b) # 可以自定義,此例表示按升序排列
方法二
x.sort() # 系統自帶的排序規則,也可以,x.sort(reverse=True) 倒序排序,sort會改變列表的排序,如果要新生成列表,可以用sorted方法
dict按值排序
d={‘name’+str(k):randint(60,100) for k in xrange(1,6)}
方法一:
sort = sorted(d.items(),key=lambda e:e[1]) # 按值排序
方法二:
dic_tup=zip(dic.itervalues(),dic.iterkeys()) # zip方法是將兩人列表拼成一個元組列表
sorted(dic_tup,reverse=True) # 對於元組的排序規則是,先按照第一個值排序,然後再依次往後
四、統計序列中元素出現的頻度
from collections import Counter
import re
f=open('django.txt') # 打開文件
txt=f.read()
f.close()
txt_list = re.split(r'\W+',txt) # 將文本轉化爲列表,以非文字字符作爲分隔符
print Counter(txt_list).most_common(10) # 統計列中元素出現的頻度,並返回頻度最高的前10個單詞
五、快速找到多個字典中的公共鍵
from random import randint, sample
baller = 'abcdefg' # 假設有7名球員
dic1 = {b: randint(1, 4) for b in sample(baller, randint(4, 6))} # 隨機生成一場球進球環員及進環數
dic2 = {b: randint(1, 4) for b in sample(baller, randint(4, 6))}
dic3 = {b: randint(1, 4) for b in sample(baller, randint(4, 6))}
方法一:循環判斷
list = []
for k in dic1:
if k in dic2 and k in dic3:
list.append(k)
方法二:
- 用字典viewkeys()方法,得到字典keys的集合
- 使用map函數得到所有字典keys的集合
- 使用reduce取得所有keys的交集
m = map(dict.viewkeys, [dic1, dic2, dic3])
r = reduce(lambda x, y: x & y, m)
六、讓字典保持有序
from time import time
from random import randint
from collections import OrderedDict
stu = list('ABCDEFGH') # 定義A B...8個學生的列表
l = len(stu)
start = time() # 記錄開始時間
dic = OrderedDict() # 定義一個排序字典,順序接添加順序排列
for i in xrange(0, l):
raw_input() # 阻塞函數,等待用戶輸入
p = stu.pop(randint(0, l - i-1)) # 隨機移除列表中元素,並返回該元素
end = time()
print p, i + 1, end - start, # print 後面爲逗號,表示打印後,不換行
dic[p]=(i+1,end-start) # 對排序字典進行賦值
print
print '-'*20 # 表示重複打印20個'-'
for k in dic:
print k,dic[k]
七、實現用戶的歷史記錄功能(最多n條)
from random import randint
from collections import deque
import pickle
# 猜數字遊戲
def guest(t, n): # 判斷數字是否準確
if t == n:
print "you are correct"
return True
if t < n:
print "your digital is litter"
else:
print "your digital is bigger"
return False
if __name__ == "__main__":
n = randint(0, 100)
p = deque([], 5) # deque是一個雙端循環隊列,隊列的長度爲5
while False:
dig = raw_input("please input digital : ")
if dig.isdigit():
dig = int(dig)
p.append(dig) # 將數字添加到隊列,當隊列中多於5個時,最先添加的將被擠出
if guest(dig, n):
f = open('digital', 'w')
pickle.dump(p, f) # 將python對象寫入到文件中
f.close()
break
elif dig == 'exit':
break
elif dig == 'h':
print list(p) # 打印隊列
f = open('digital', 'r') # 打開文件
p = pickle.load(f) # 從文件中讀取python對象
f.close()
print list(p)