查看原文
其他

Python字典里的5个黑魔法

2016-09-23 xinxin 菜鸟学python

阅读本文大概需要5.8 分钟




Python里面有3大数据结构表,字典和集合.字典是常用的数据结构,里面有一些重要的技巧用法,我把这些都整理到一起,熟练掌握这些技巧之后,对自己的功力大有帮助.


1.字典的排序:

用万金油sorted()函数

  • 举一个简单的例子

   my_dict={"cc":100,"aa":200,"bb":10}

    print(sorted(my_dict.iteritems(),key=lambda x:x[0]))#表示按照key排序

    >>>[('aa', 200), ('bb', 10), ('cc', 100)]

    

    print(sorted(my_dict.iteritems(),key=lambda x:x[1]))#表示按照value排序

    >>>[('bb', 10), ('cc', 100), ('aa', 200)]


注意原始的my_dict本身顺序并没有变(不信你可以print看看),排序是通过sorted()返回了一个新的字典


  • 另外一种做法,因为字典是无序,若你一开始设计的时候就希望这个数据结构,按照的添加的顺序进行有序排列(比如读取CSV文件),那么我们就是利用collection模块里面的OrderedDict()处理:

        from collections import OrderedDict

        

        orderDict=OrderedDict()

        orderDict['a']=1

        orderDict['b']=2

        orderDict['c']=3

        print(orderDict)

        >>>OrderedDict([('a', 1), ('b', 2), ('c', 3)])


  • 对比一下,若是普通的dict是乱序的,若不用OrderedDict()

        orderDict=dict()

        orderDict['a']=1

        orderDict['b']=2

        orderDict['c']=3

        print(orderDict)

        >>>{'a': 1, 'c': 3, 'b': 2}


最后要提醒一下:OrderedDict()虽然是好东西,但是它内部维护了一个双向链表,若数据量很大的话,会非常消耗内存.


2.字典的取值

字典中取值大家很容易想到用dict[key],这个有什么难的,确实一般取值是这样的,但是你有没有想过若你取的值不存在就会发生异常,风险很大.(良好的代码,一定是要考虑健壮性,切记)



因为试图通过索引的方式去取值,比如dict[key],当key不是字典dict的键,会引起异常有没有什么两全的办法有值的时候取值,没有值的时候即使我取不到也不会发生异常

答案是有的,python早就给你准备好了.我们用dict.get()



建议:尽量用dict.get()来代替dict[key]


3.字典中提取部分子集

我们原来有一个长的字典,我们想提取其中一部分变成另外一个子集,我们怎么做呢,我们来看一个小例子:


students_score={'jack':80,'james':91,'leo':100,'sam':60}

#提取分数超过90分的学生信息,并变成字典

我们可以用字典推导式,轻松搞定

good_score={name:score for name,score in students_score.items() if score>90}

print(good_score)

>>>{'james': 91, 'leo': 100}


4.字典的计算

比如我们有一个字典是记录股票的价格呢,一般key都是股票的名字,而value是价格,若我们想对价格进行计算,应该如何处理呢,我们还是通过实例来讲解:


下面是一个股票价格的字典,我们希望得到里面的最大值,最小值

stocks={'wanke':25.6,'wuliangye':32.3,'maotai':299.5,'huatai':18.6}


一般有几种方法:

  • 利用字典的values():



  • 利用神奇的zip()进行翻转(zip详细用法我前面的文章里面经过,可以从历史文章里面找一下)



是不是对python的用法叹为观止,太神奇了,内置了这么多方便的用法,若用c++,java处理这些问题要好几倍的代码.


5.字典的翻转

在处理复杂的数据结构的时候,有的时候希望把字典翻转,一般用推导列表进行过渡,然后再用dict()函数编程字典


若碰到比较大的字典,数据量很多很长的时候,最好用Python标准库里的itertools模块(顺便说一下,这个模块非常有用,大家可以关注一下)

from itertools import izip

invert_stocks2=dict(izip(stocks.itervalues(),stocks.iterkeys()))

print(invert_stocks2)




以上就是对Python字典的一些技巧总结和自己的感悟,希望我写的对大家有一点点帮助,能给大家在日常使用python中能提高一些技巧,也不枉我大半夜码这么多字。


最后说一下,原创不易,希望大家能够给点支持,欢迎转发,留言,也是对我的一点鼓励和动力.


也欢迎更多喜欢Python的同学关注 菜鸟学python,一起来学python吧 长按下方的二维码即可关注.




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存