zoukankan      html  css  js  c++  java
  • day①:字典

    字典

    特点:

      1.key-value格式,key是唯一。

      2.无序。

      3.查询速度块,dict是基于hash表的原理实现的,是根据关键字而直接访问在内存存储位置的数据结构。

    字典内建方法:

    dict.clear() # 删除字典中所有元素
    dict copy() # 返回字典(浅复制)的一个副本
    dict.fromkeys(seq,val=None) # 创建并返回一个新字典,以seq中的元素做该字典的键,val做该字典中所有键对的初始值
    dict.get(key,default=None) # 对字典dict中的键key,返回它对应的值value,如果字典中不存在此键,则返回default值
    dict.has_key(key) # 如果键在字典中存在,则返回True ,python3.x用in和not in代替
    dicr.items() # 返回一个包含字典中键、值对元组的列表
    dict.keys() # 返回一个包含字典中键的列表
    dict.iter() # 方法iteritems()、iterkeys()、itervalues()与它们对应的非迭代方法一样,不同的是它们返回一个迭代子,而不是一个列表
    dict.pop(key[,default]) # 和方法get()相似.如果字典中key键存在,删除并返回key的值value,如果key不存在则返回一个KeyError

    dict.popitem() #无序随机删除一条元素
    dict.setdefault(key,default=None) # 和set()相似,key存在返回对应值value,但如果字典中不存在key键,由default为它赋值,默认default=None。
    dict.update(dict2) # 将字典dict2的键值对添加到字典dict,循环判断dict2里面的值是否存在dict,存在就更新,不存在则插入。
    dict.values() # 返回一个包含字典中所有值得列表

    dict([container]) # 创建字典的工厂函数。提供容器类(container),就用其中的条目填充字典
    len(mapping) # 返回映射的长度(键-值对的个数)
    hash(obj) # 返回obj哈希值,判断某个对象是否可做一个字典的键值        

    例子:

    >>> message={'name':'kubi','job':'yunwei','age':'24','company':'gaiwang'}
    >>> message
    {'age': '24', 'job': 'yunwei', 'company': 'gaiwang', 'name': 'kubi'}
    >>> message['name'] #查看key为‘name’的value
    'kubi'
    >>> message['job'] = 'Boss' #将key的value改为‘Boss’
    >>> message
    {'age': '24', 'job': 'Boss', 'company': 'gaiwang', 'name': 'kubi'}
    >>> message['city'] = 'GZ' #如果dict中有key为‘city’,就将其值改为‘GZ’,没有就新创一条
    >>> message
    {'age': '24', 'job': 'Boss', 'company': 'gaiwang', 'name': 'kubi', 'city': 'GZ'}
    >>> message.pop('age') #删除key为‘age’的数据
    '24'
    >>> message
    {'job': 'Boss', 'company': 'gaiwang', 'name': 'kubi', 'city': 'GZ'}
    >>> del message['city'] #和上面删除意思一样
    >>> message
    {'job': 'Boss', 'company': 'gaiwang', 'name': 'kubi'}
    >>> message.popitem() #随机删除一条,dict空会报错
    ('job', 'Boss')
    >>> message
    {'company': 'gaiwang', 'name': 'kubi'}
    >>> message.items() #将dict的key,value转换成列表的形式显示
    [('company', 'gaiwang'), ('name', 'kubi')]
    >>> message.has_key('name') #判断key存不存在
    True
    >>> message['city'] #不存在,报错
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    KeyError: 'city'
    >>> message.get('city') #查找key,如果存在返回其value,否则返回None

     >>> message.get('city',"not exsit") #还可以这样子定义!!定义一个信息,不存在这个key,返回这个信息。

     'not exsit'

    >>> message.get('name')
    'kubi'
    >>> message.clear() #清空字典
    >>> message
    {}
    >>> message.fromkeys(['a','b','c','d'],'Test') #根据列表['a','b','c','d']来创建dict里面的key,后面的‘test’是默认value,如果不指定的话则None
    {'a': 'Test', 'c': 'Test', 'b': 'Test', 'd': 'Test'}
    >>> message
    {}
    >>> message=message.fromkeys(['a','b','c','d'],'Test')
    >>> message
    {'a': 'Test', 'c': 'Test', 'b': 'Test', 'd': 'Test'}
    >>> message.setdefault('e','yaobin') #找一个key为‘e’的记录,如果这个key不存在,那就创建一个叫‘e’的key,它的值为‘yaobin’,如果这个值存在,就直接返回这个key的value,见下条
    'yaobin'
    >>> message
    {'a': 'Test', 'c': 'Test', 'b': 'Test', 'e': 'yaobin', 'd': 'Test'}
    >>> message.setdefault('d','yaobin')
    'Test'
    >>> message
    {'a': 'Test', 'c': 'Test', 'b': 'Test', 'e': 'yaobin', 'd': 'Test'}
    >>> dict2={'f':'fromDict2','d':'fromDict2'} #创建一个新字典
    >>> dict2
    {'d': 'fromDict2', 'f': 'fromDict2'}
    >>> message.update(dict2) #拿这个字典去更新message,注意dict2中有一个key值‘d’与message冲突,这时dict2中key为‘d’的value会覆盖info中key为‘d’的value,如果dict2中的key在message中不存在,则创建相应的记录
    >>> message
    {'a': 'Test', 'c': 'Test', 'b': 'Test', 'e': 'yaobin', 'd': 'fromDict2', 'f': 'fromDict2'}
    >>> 

    遍历dict

    >>> message={'name':'kubi','age':'24','job':'yunwei','phone':'12345679'}
    >>> message
    {'job': 'yunwei', 'phone': '12345679', 'age': '24', 'name': 'kubi'}
    ①:第一种方法,大数据量的时候要用这种方法!
    >>> for item in message:
    ...     print item,message[item]
    ... 
    job yunwei
    phone 12345679
    age 24
    name kubi
    ②:第二种方法
    >>> for key,val in message.items():
    ...   print key,val
    ... 
    job yunwei
    phone 12345679
    age 24
    name kubi

    字典的深浅copy:

    先理解一下变量的定义:

    >>> a=1
    >>> b=a
    >>> a
    1
    >>> b
    1
    >>> b=3
    >>> b
    3
    >>> a
    1

    其实只是把变量a所指向的内存地址copy给了变量b,修改变量b,变量a不会受影响

    >>> message={111:{'name':'yaobin','age':24,'department':'IT','phone':4561},222:{'name':'hy','age':23,'department':'management Team','phone':7894},333:{'name':'nimei','age':22,'department':'HR','phone':1234}} 
    >>> message
    {333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}, 222: {'department': 'management Team', 'phone': 7894, 'age': 23, 'name': 'hy'}, 111: {'department': 'IT', 'phone': 4561, 'age': 24, 'name': 'yaobin'}}
    >>> message2=message
    >>> message2
    {333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}, 222: {'department': 'management Team', 'phone': 7894, 'age': 23, 'name': 'hy'}, 111: {'department': 'IT', 'phone': 4561, 'age': 24, 'name': 'yaobin'}}
    >>> message[111]['age']=30
    >>> message[111]
    {'department': 'IT', 'phone': 4561, 'age': 30, 'name': 'yaobin'} #发现两个数据都改了
    >>> message2[111]
    {'department': 'IT', 'phone': 4561, 'age': 30, 'name': 'yaobin'} #发现两个数据都改了
    >>> id(message[111])
    140729396260208
    >>> id(message2[111])
    140729396260208

    ##对于dict、list、tuple以及set集合,python不会像变量那么做了,而只是简单的别名,像linux软连接一样。

    ##因为一般来讲,一个变量存字符串、数字等简单的数据类型,存的信息不会太多,但如果存一个list或者dict,这个变量说不准,有可能几千几万条,,如果copy出来,非常消##耗资源,所以python帮你做了个软连接,

    ##对于复杂数据dict or list等,无论你怎么复制,最终修改的其实是一份数据。

    浅copy:

     copy(...)
         D.copy() -> a shallow copy of D

    例子:

    >>> message[3333]='nothing' #首先在message增加key value,注意3333的值是字符串‘nothing’
    >>> message
    {3333: 'nothing', 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}, 222: {'department': 'management Team', 'phone': 7894, 'age': 23, 'name': 'hy'}, 111: {'department': 'IT', 'phone': 4561, 'age': 30, 'name': 'yaobin'}}
    >>> message3=message.copy() #浅copy
    >>> message3
    {111: {'department': 'IT', 'phone': 4561, 'age': 30, 'name': 'yaobin'}, 3333: 'nothing', 222: {'department': 'management Team', 'phone': 7894, 'age': 23, 'name': 'hy'}, 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}}
    >>> message
    {3333: 'nothing', 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}, 222: {'department': 'management Team', 'phone': 7894, 'age': 23, 'name': 'hy'}, 111: {'department': 'IT', 'phone': 4561, 'age': 30, 'name': 'yaobin'}}
    
    >>> message[111]['age']=24 #修改message的第二层字典
    >>> message[3333]='nimeidecacaca' #修改message的第一层字符
    
    
    >>> message
    {3333: 'nimeidecacaca', 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}, 222: {'department': 'management Team', 'phone': 7894, 'age': 23, 'name': 'hy'}, 111: {'department': 'IT', 'phone': 4561, 'age': 24, 'name': 'yaobin'}}
    ##会发现第一层的字符是变了,变为nimeidecacaca
    
    >>> message3
    {111: {'department': 'IT', 'phone': 4561, 'age': 24, 'name': 'yaobin'}, 3333: 'nothing', 222: {'department': 'management Team', 'phone': 7894, 'age': 23, 'name': 'hy'}, 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}}
    ##会发现第一层的字符没有变,还是nothing
    ##会发现我修改message的第二层字典,message3的第二层字典跟着变!

    完完全全的copy:

    >>> import copy
    >>> new_message=copy.deepcopy(message)
    >>> new_message
    {111: {'department': 'IT', 'phone': 4561, 'age': 24, 'name': 'yaobin'}, 3333: 'hehe', 222: {'department': 'management Team', 'phone': 54546654, 'age': 23, 'name': 'hy'}, 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}}
    >>> message
    {3333: 'hehe', 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}, 222: {'department': 'management Team', 'phone': 54546654, 'age': 23, 'name': 'hy'}, 111: {'department': 'IT', 'phone': 4561, 'age': 24, 'name': 'yaobin'}}
    ##message和new_message一模一样
    
    >>> new_message
    {111: {'department': 'IT', 'phone': 4561, 'age': 24, 'name': 'yaobin'}, 3333: 'hehe', 222: {'department': 'management Team', 'phone': 54546654, 'age': 23, 'name': 'hy'}, 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}}
    >>> message[3333]='new' #修改message
    >>> message            
    {3333: 'new', 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}, 222: {'department': 'management Team', 'phone': 54546654, 'age': 23, 'name': 'hy'}, 111: {'department': 'IT', 'phone': 4561, 'age': 24, 'name': 'yaobin'}}
    >>> new_message        
    {111: {'department': 'IT', 'phone': 4561, 'age': 24, 'name': 'yaobin'}, 3333: 'hehe', 222: {'department': 'management Team', 'phone': 54546654, 'age': 23, 'name': 'hy'}, 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}}
    #new_message没有变
    
    
    >>> new_message[3333]='new_new' #修改new_message
    >>> new_message                
    {111: {'department': 'IT', 'phone': 4561, 'age': 24, 'name': 'yaobin'}, 3333: 'new_new', 222: {'department': 'management Team', 'phone': 54546654, 'age': 23, 'name': 'hy'}, 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}}
    >>> message
    {3333: 'new', 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}, 222: {'department': 'management Team', 'phone': 54546654, 'age': 23, 'name': 'hy'}, 111: {'department': 'IT', 'phone': 4561, 'age': 24, 'name': 'yaobin'}}
    #message没有变
  • 相关阅读:
    测试工具iometer, iozone, bonnie++
    python 解析properties文件的工具类
    Linux文件系统性能测试工具fdtree和iozone
    python的WEB容器框架
    iozone的介绍与使用
    Python 的 SOAP 实现
    在powerpoint2007里,如何改变模板里的背景图形
    python的接口和抽象类
    决策树算法总结
    C++ 重载、覆盖和隐藏
  • 原文地址:https://www.cnblogs.com/binhy0428/p/5086063.html
Copyright © 2011-2022 走看看