給dict設定預設值
這樣能設定所有key的預設值為[],包括新添的key
1 2 |
from collections import defaultdict context = defaultdict(list) |
setdefault一次只能設定一個值,但好處是能使用鏈式語法,但defaultdict
更快一些
1 2 |
context = {} context.setdefault('name_list', []).append('Fiona') |
或者用fromkeys,用法dict.fromkeys(seq[, value]))
,value
預設是國際慣例的None
1 2 3 4 5 6 |
name_list = ['kevin', 'robin'] context = {}.fromkeys(name_list, 9) # {'kevin': 9, 'robin': 9} context = dict.fromkeys([1, 2], True) # {1: True, 2: True} |
列表去重的快速方法
比用set要快,來自:http://www.peterbe.com/plog/uniqifiers-benchmark
1 |
{}.fromkeys(mylist).keys() |
列表深複製
1 2 |
a = [3, 2, 1] b = a[:] |
字典深複製
1 2 |
a = {'male':0, 'female': 1} b = a.copy() |
時間轉換相關
獲取今天的年月日時間(date)
兩種程式碼效果相同
1 2 3 4 |
from datetime import datetime n_date = datetime.now().date() n_date = datetime.today().date() |
date -> datetime
1 2 3 4 |
from datetime import datetime b = datetime.combine(n_date, datetime.min.time()) # datetime.datetime(2015, 9, 8, 0, 0) |
datetime -> date
比較簡單,直接使用datetime_object.date()
即可
1 2 3 4 |
# datetime.datetime(2015, 6, 5, 11, 45, 45, 393548) a = datetime.datetime() # datetime.datetime(2016, 6, 5) b = a.date() |
time.struct_time -> datetime
一般time.localtime()
或者用time.striptime()
得到的就是time.struct_time
使用位置引數
1 2 3 |
structTime = time.localtime() datetime.datetime(*structTime[:6]) # datetime.datetime(2009, 11, 8, 20, 32, 35) |
或者使用datetime.fromtimestamp
,但是要注意此處的時間不能早於1970-01-01 00:00
1 2 3 4 |
from time import mktime from datetime import datetime dt = datetime.fromtimestamp(mktime(struct)) |
計算日期之差
1 2 3 4 5 6 |
from datetime import date d0 = date(2008, 8, 18) d1 = date(2008, 9, 26) delta = d0 - d1 print delta.days |
獲取milliseconds(13位數字)
1 2 3 4 5 6 7 8 9 10 |
import time from datetime import datetime time.time() # 1441769033.549239 int(time.time() * 1000) # 1441769033549 # or def unix_time_milliseconds: time_gap = datetime.utcnow() - datetime.utcfromtimestamp(0) return int(time_gap.total_seconds() * 1000) # 1441769033549 |
使用map作iterator
當將func設定為None時,可起到iterator的作用,結果類似於使用了zip,唯一的區別是map可以按最長的列表擴充套件。
python2.x中的itertools.zip_longest
可以起到與此處map相同的效果
1 2 3 4 |
map(None, xrange(3), xrange(10,12)) # [(0, 10), (1, 11), (2, None)] zip(xrange(3), xrange(10,12)) # [(0, 10), (1, 11)] |
判斷奇數
自然是使用位操作最快了
1 2 |
if a & 1: print 'it is even' |
dict刪除key
要刪除的key數量較多(超多一半)的話,建議重新生成dict
;如果數量較少,在pop
和del
都可以的情況下,del
稍快一些
1 2 |
python -m timeit -s "d = {'f':1,'foo':2,'bar':3}" "d1 = d.copy()" "for k in d1.keys():" " if k.startswith('f'):" " del d1[k]" # 1000000 loops, best of 3: 0.827 usec per loop |
1 2 |
python -m timeit -s "d = {'f':1,'foo':2,'bar':3}" "d1 = d.copy()" "for k in d1.keys():" " if k.startswith('f'):" " d1.pop(k)" # 1000000 loops, best of 3: 0.96 usec per loop |