python中的dict数据是按key的hash值存放的,说是不保证输入顺序和输出顺序一致。
不好复现:
a={'b':2,'a':1,'c':6,'g':9,'e1':4,'e0':2}
a.setdefault('d',5)
a.setdefault('0d',3.5)
a['b1']=2.1
for k,v in a.items():
print(k,v)
结果
b 2
a 1
c 6
g 9
e1 4
e0 2
d 5
0d 3.5
b1 2.1
不管,下面,主要记录下它的排序。
a={55:2,22:3,66:1}
ss=sorted(a.items())
print(ss)
ss=sorted(a.items(),key=lambda x:x[1])
print(ss)
ss=sorted(a.items(),key=lambda x:x[1],reverse=True)
print(ss)
结果
[(22, 3), (55, 2), (66, 1)]
[(66, 1), (55, 2), (22, 3)]
[(22, 3), (55, 2), (66, 1)]
sorted有三个参数
有三种方式。
a={'b':2,'a':1,'c':6,'g':9,'e1':4,'e0':2}
ss=sorted(a.items(), key = lambda x:x[0])
a={'b':2,'a':1,'c':6,'g':9,'e1':4,'e0':2}
ss = sorted(zip(a.keys(),a.values()))
a={'b':2,'a':1,'c':6,'g':9,'e1':4,'e0':2}
ss = [(k, a[k]) for k in sorted(a.keys())]
或
ss= sorted(a.items()) #默认就是按key排序
有两种方式。
注意与按key排序的区别,在匿名函数中使用了x[1]
a={'b':2,'a':1,'c':6,'g':9,'e1':4,'e0':2}
ss=sorted(a.items(), key = lambda x:x[1])
注意与按key排序的区别,zip中传参顺序。
a={'b':2,'a':1,'c':6,'g':9,'e1':4,'e0':2}
ss=sorted(zip(a.values(), a.keys()))
发现ipython中提供了较多的“magic函数”,如%time就是用来统计运行时间的。所以下面的测试是基于ipython的,用户可以自己安装ipython,也可以使用别人封装了ipython的平台,这个量化网站中的研究环境可以使用ipython。
a={'b':2,'a':1,'c':6,'g':9,'e1':4,'e0':2}
def sortvalue1():
i=0
while i<1000000:
ss=sorted(a.items(), key = lambda x:x[1])
i+=1
%time sortvalue1()
def sortvalue2():
i=0
while i<1000000:
ss=sorted(zip(a.values(), a.keys()))
i+=1
%time sortvalue2()
def sortkey1():
i=0
while i<1000000:
ss=sorted(a.items(), key = lambda x:x[0])
i+=1
%time sortkey1()
def sortkey2():
i=0
while i<1000000:
ss = sorted(zip(a.keys(),a.values()))
i+=1
%time sortkey2()
def sortkey3():
i=0
while i<1000000:
ss = [(k, a[k]) for k in sorted(a.keys())]
i+=1
%time sortkey3()
测试某一个结果
CPU times: user 2.34 s, sys: 8 ms, total: 2.35 s
Wall time: 2.37 s
CPU times: user 1.91 s, sys: 0 ns, total: 1.91 s
Wall time: 1.91 s
CPU times: user 2.34 s, sys: 0 ns, total: 2.34 s
Wall time: 2.35 s
CPU times: user 2.11 s, sys: 0 ns, total: 2.11 s
Wall time: 2.22 s
CPU times: user 2.16 s, sys: 4 ms, total: 2.16 s
Wall time: 2.27 s
结论:相差不太,自己又运行了多次,看着是用sorted+zip快一点点。
上面的测试写得有点傻,改写一下,用装饰器。顺便把dict弄多一点数据。
a={'b':2,'a':1,'c':6,'g':9,'e1':4,'e0':2,'b9':2,'a8':1,'c7':6,'g5':9,'e00':4,'e7':2}
def dowhile(func):
def do():
i=0
while i<1000000:
func()
i+=1
return do
@dowhile
def sortvalue1():
ss=sorted(a.items(), key = lambda x:x[1])
%time sortvalue1()
@dowhile
def sortvalue2():
ss=sorted(zip(a.values(), a.keys()))
%time sortvalue2()
@dowhile
def sortkey1():
ss=sorted(a.items(), key = lambda x:x[0])
%time sortkey1()
@dowhile
def sortkey2():
ss = sorted(zip(a.keys(),a.values()))
%time sortkey2()
@dowhile
def sortkey3():
ss = [(k, a[k]) for k in sorted(a.keys())]
%time sortkey3()
一个测试结果
CPU times: user 3.67 s, sys: 4 ms, total: 3.67 s
Wall time: 3.78 s
CPU times: user 3.12 s, sys: 4 ms, total: 3.12 s
Wall time: 3.23 s
CPU times: user 4.12 s, sys: 8 ms, total: 4.13 s
Wall time: 4.24 s
CPU times: user 3.35 s, sys: 0 ns, total: 3.35 s
Wall time: 3.59 s
CPU times: user 3.06 s, sys: 4 ms, total: 3.07 s
Wall time: 3.09 s
结论:这样看出按value的时候用sorted+zip比较快,而按key的时候,直接用sorted比较快。