zoukankan      html  css  js  c++  java
  • [Python入门及进阶笔记]Python基础字典小结

    博客迁往:新地址 (点击直达)

    新博客使用markdown维护,线下有版本库,自己写的所以会定时更新同步,同时提供更好的导航和阅读体验

    csdn对markdown支持不好,所以旧版不会花时间进行同步修订,抱歉


    -----------------------

    字典

    定义

    dictionary

    1.键值对的集合(map)

    2.字典是以大括号“{}”包围的数据集合

    3.字典是无序的,在字典中通过键来访问成员。 可变的,可嵌套,可以原处修改扩展等,不产生新的字典

    4.字典的键,可以是字符串(大小写敏感),数字常量或元组(不可变类型),同一个字典的键可以混用类型。字典的键必须是可哈希的

    元组作为键的条件是,元组内的值都是不可变类型

      a = (1,2)  #可以作为键
      b = (1,2,[3,4])  #不可以
    

    5.字典的值可以是任意类型,可以嵌套,可以自由修改

    声明

    创建字典的几种方式:

    1.基本

    d = {} #空字典
    d = {'name':'tom', 'age':22} 
    #等价
    d = {}
    d['name'] = 'tom'
    d['age'] = 22
    

    2.dict

    d = dict() #空
    d = dict(name='tom', age=22)   
    
    d = dict([('name','tom'), ('age',22)])
    #等价
    keys = ['name','age']
    values = ['tom', 22]
    d = dict(zip(keys,values))
    

    3.fromkeys

    不指定default_value的话,默认None

    >>> dict.fromkeys(['name','age'],'default_value')
    {'age': 'default_value', 'name': 'default_value'}
    

    基本操作

    0.获取帮助

    help(dict)
    

    1.判定键是否存在于字典中

    if k in d:   #k not in
        dosomething()
    

    2.读取

    d = {'a':1, 'b':2}
    
    print d['a']  #得到1,但是若键不存在,将引发异常KeyError。慎用,建议不使用
    
    print d.get('c', 3) #得到3,get方法,若是键不存在,返回第二个参数default_value.若是没有设default_value返回None
    

    处理missing-key错误三种方式,根据具体需要

    if k in d:
        print d[k]
    
    try:
        print d[k]
    except KeyError:
        dosomething()
    
    print d.get(k, default)
    #等价 d[k] if k in d else default
    

    3.遍历

    方式1:

    for key in d:
        print key, d[key]
    #等价 for key in d.keys()
    

    方式2:

    for key,value in d.items():
        print key, value
    

    4.修改方式1:某个键值对

    d['key'] = 'newvalue'
    

    方式2:批量添加或更新

    #另一个字典
    d.update({'key':'newvalue'})  #这里支持一整组值
    
    #元组列表
    d.update( [ ('a',1), ('b',2) ] ) #每个元组两个元素,(key,value)
    
    #**key
    d.update(c=3, e=4) 
    

    5.删除

    del d['key']
    value = d.pop('key') #删除并返回值
    d.clear() #清空
    

    6.其他:

    len(d)   #长度
    d.keys()  #key列表
    d.values()  #value列表
    d.items()   #(key, value) 列表
    c = d.copy()   #浅拷贝
    #返回迭代器,节省内存
    d.iterkeys()
    d.itervalues()
    d.iteritems()
    d.setdefault('name', 'ken') #若原来没有,设置,否则原值不变
    

    其他

    1.字典排序按照key排序

    keys = d.keys()
    keys.sort()
    for key in keys:
        print d.get(key)
    

    按照value进行排序

    sorted(d.items(), lambda x,y: cmp(x[1],y[1]))
    

    另外:

    #假设d为字典
    sorted(d)  #返回同 sorted(d.keys()),返回的是key排序
    

    2.自定义对象作为key

    必须:

    def __hash__(self):
        pass
    def __eq__(self, other):
        pass
    

    3.字典拷贝浅拷贝:

    c = d.copy() #
    

    深拷贝必须用copy模块

    form copy import deepcopy
    c = deepcopy(d)
    

    4.一种使用场景假设有一个很大的列表l,假设10w条记录

    有一个小列表b,要判断b中元素是否在l中

    如果:

    for i in b:
        if i in l:
            dosomething()
    

    你会发现非常非常慢...因为第二个in语句,会遍历10w条….

    改进:

    d = dict.fromkeys(l)
    for i in b:
        if i in d:
            dosomething()
    #空间换时间,O(n) -> O(1)
    

    The end!

    To be continue

    wklken

    Email: wklken@yeah.net

    Blog: http://blog.csdn.net/wklken

    2013-03-09

    转载请注明出处,谢谢

    Meet so Meet. C plusplus I-PLUS....
  • 相关阅读:
    Mac下终端常用命令
    mac上完整卸载删除.简单粗暴无脑:androidstudio删除方案
    Mac版 Intellij IDEA 激活
    解决Pods Unable to find a specification for `xxxxx`问题
    java并发编程(十五)内存可见两种方式 加锁和volatile
    java并发编程(五)正确使用volatile
    java并发编程(十四)同步问题的内存可见性
    java并发编程(十三)经典问题生产者消费者问题
    java并发编程(十三)线程间通信中notifyAll造成的早期通知问题
    java并发编程(十一)线程间的通信notify通知的遗漏
  • 原文地址:https://www.cnblogs.com/iplus/p/4464616.html
Copyright © 2011-2022 走看看