2011年12月28日 星期三

[python]dict sort by key or value

熊熊忘記該怎麼 sort by value,查了一下網路記下來。

for key in sorted(mydict.iterkeys()):
print "%s: %s" % (key, mydict[key])

 

for key, value in sorted(mydict.iteritems(), key=lambda (k,v): (v,k)):
print "%s: %s" % (key, value)

 



# (IMHO) the simplest approach:
def sortedDictValues1(adict):
items = adict.items()
items.sort()
return [value for key, value in items]

# an alternative implementation, which
# happens to run a bit faster for large
# dictionaries on my machine:
def sortedDictValues2(adict):
keys = adict.keys()
keys.sort()
return [dict[key] for key in keys]

# a further slight speed-up on my box
# is to map a bound-method:
def sortedDictValues3(adict):
keys = adict.keys()
keys.sort()
return map(adict.get, keys)

 



d= [ {'id':0, 'value':9}, {'id':1, 'value':100}, {'id':5, 'value':99}, {'id':3, 'value':19}, {'id':2, 'value':59} ]
d.sort(key=lambda x:x['id']) #針對key 'id' 做sort
d.sort(key=lambda x:x['value']) #針對key 'value' 做sort

#以下用cmp,可以達到上面指定key的效果
d.sort(cmp=lambda x,y: cmp(x['id'], y['id']))
d.sort(cmp=lambda x,y: cmp(x['value'], y['value']))

 

class data:
def __init__(self, _id, _value):
self.id = _id
self.value = _value
c = [ data(0,9), data(1,100), data(5,99), data(3,19), data(2,59) ]
c.sort(key=lambda x:x.id)#針對class member id 做sort
c.sort(key=lambda x:x.value)#針對class member value 做sort

#以下用cmp,可以達到上面指定key的效果
c.sort(cmp=lambda x,y: cmp(x.id, y.id) )
c.sort(cmp=lambda x,y: cmp(x.value, y.value))

2011年12月23日 星期五

[python]datetime

從 javascript 的 datetime 的 timestamp 了解到,
python 無法直接獲得 timestamp 的值。
一般來說這個 timestamp 指的是Unix epoch (or Unix time or POSIX time or Unix timestamp)
根據這裡提到,也許是 datetime 的表示法有很多種,且精準度高於 timestamp,
所以就沒有直接提供方法。

但是也不是沒辦法。

在得到一個 datetime object 後

import datetime
x = datetime.datetime.now()

# datetime.datetime(2011, 12, 23, 17, 17, 58, 625000)

第一種是藉 calendar 模組

>>> import calendar
>>> calendar.timegm(x.timetuple())
1324660678

這是得到標準時區的 timestamp,所以要轉回原來時區(local)的時間,不能用 fromtimestamp,
而是要用 utcfromtimestamp

>>> y = calendar.timegm(x.timetuple())
>>> z = datetime.datetime.fromtimestamp(y)
>>> z
datetime.datetime(2011, 12, 24, 1, 17, 58)
>>> y = calendar.timegm(x.timetuple())
>>> z = datetime.datetime.utcfromtimestamp(y)
>>> z
datetime.datetime(2011, 12, 23, 17, 17, 58)

另一個方法是用 time 模組,產生出來的 timestamp 就長不一樣。
這個用 fromtimestamp 就可以得到local datetime。

>>> import time
>>> y = time.mktime(x.timetuple())
>>> y
1324631878.0
>>> z = datetime.datetime.fromtimestamp(y)
>>> z
datetime.datetime(2011, 12, 23, 17, 17, 58)

這裡有個貼心的網站,幫你整理各語言如何得到 timestamp。
http://www.epochconverter.com/

在寫程式時一定要先測試一下數值是否如你所想喔

[javascript]時間的操作

時間物件的實體化有四種

var dt = new Date();
var dt = new Date(milliseconds);
var dt = new Date(dateString);
var dt = new Date(year, month, day, hours, minutes, seconds, milliseconds);

如果是要現在時間,就用第一個即可。

第二種方法的 milliseconds 是從 1970/01/01 開始算。
這個數字通常不會是自己算,而是從別的地方傳來。
他的好處是,用一個 float 就可以表示一個時間,比字串更省空間。
同時排序、計算(時間加減)也更快速。
在 .Net 裡,所謂的 timestamp 就是這個數值;
python 裡,據說有些轉換上的問題, 也就沒有提供 datetime 直接產生 timestamp 的方法。
這裡先不提。
javascript 則是有 getTime() 方法可以產生這個數字。
但是要注意時區問題,不然會有時間差喔。

第三種方法的 dateString 就要看運氣了,格式還是要對 javascript 的胃口。
如果沒把握,以下格式是可以的:
"October 13, 1975 11:13:00"
"12-23 13:44:32, 2011"
"Dec 23 14:00:12 2011"
而我最愛的格式不行:
"2011-12-23 13:44:32"

第四種方法就穩定,每一項分開就不會有問題。

全部要注意的是千禧年問題,也就是以前常把四位數年份表示縮成兩位數,
請記得不要再這樣做了,這不是一個好習慣。