Python dict按key或按value排序

文章目录

  • 前言
  • 基于sorted的排序
  • 按key排序
    • 使用sorted+lambda
    • 使用sorted+zip
    • 直接用sorted
  • 按value排序
    • 使用sorted+lambda
    • 使用sorted+zip
  • 速度测试
  • 附送

前言

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

不管,下面,主要记录下它的排序。

基于sorted的排序

sorted函数
默认排序是升序,可用参数reverse=True实现降序

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有三个参数

按key排序

有三种方式。

使用sorted+lambda

a={'b':2,'a':1,'c':6,'g':9,'e1':4,'e0':2}
ss=sorted(a.items(), key = lambda x:x[0])

使用sorted+zip

a={'b':2,'a':1,'c':6,'g':9,'e1':4,'e0':2}
ss = sorted(zip(a.keys(),a.values()))

直接用sorted

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排序

按value排序

有两种方式。

使用sorted+lambda

注意与按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])

使用sorted+zip

注意与按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比较快。

你可能感兴趣的:(Python)