python学习之路2

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


1.字典的排序:

sorted()函数

  • 举一个简单的例子

   my_dict={"cc":10,"aa":20,"bb":1}

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

    >>>[('aa', 20), ('bb', 1), ('cc', 10)]

     

    

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

    >>>[('bb', 1), ('cc', 10), ('aa', 20)]

    


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


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

        from collections import OrderedDict

        

        orderDict=OrderedDict()

        orderDict['a']=1

        orderDict['b']=2

        orderDict['c']=3

        print(orderDict)

        


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

        orderDict=dict()

        orderDict['a']=1

        orderDict['b']=2

        orderDict['c']=3

        print(orderDict)

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


    OrderedDict 内部维护着一个根据键插入顺序排序的双向链表。每次当一个新的元素插入进来的时候,它会被放到链表的尾部。对于一个已经存在的键的重复赋值不会改变键的顺序。

    需要注意的是,一个 OrderedDict 的大小是一个普通字典的两倍,因为它内部维护着另外一个链表。所以如果你要构建一个需要大量 OrderedDict 实例的数据结构的时候 (比如读取 100,000 行 CSV 数据到一个 OrderedDict 列表中去),那么你就得仔细权衡一下是否使用 OrderedDict 带来的好处要大过额外内存消耗的影响。


2.字典的取值

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

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


4.字典的计算

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


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

prices = {
'ACME': 45.23,
'AAPL': 612.78,
'IBM': 205.55,
'HPQ': 37.20,
'FB': 10.75
}


一般有几种方法:

  • 利用字典的values():

    

  • 利用神奇的zip()进行翻转:为了对字典值执行计算操作,通常需要使用 zip() 函数先将键和值反转过来。

    

    执行这些计算的时候,需要注意的是 zip() 函数创建的是一个只能访问一次的迭代器。比如,下面的代码就会产生错误:

    

    一个字典就是一个键集合与值集合的映射关系。字典的 keys() 方法返回一个展现键集合的键视图对象。键视图的一个很少被了解的特性就是它们也支持集合操作,比如集合并、交、差运算。所以,如果你想对集合的键执行一些普通的集合操作,可以直接使用键视图对象而不用先将它们转换成一个 set。字典的 items() 方法返回一个包含 (键,值) 对的元素视图对象。这个对象同样也支持集合操作,并且可以被用来查找两个字典有哪些相同的键值对。

    尽管字典的 values() 方法也是类似,但是它并不支持这里介绍的集合操作。某种程度上是因为值视图不能保证所有的值互不相同,这样会导致某些集合操作会出现问题。不过,如果你硬要在值上面执行这些集合操作的话,你可以先将值集合转换成set,然后再执行集合运算就行了。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值