• 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没有变
  • 相关阅读:
    eclipse下c/cpp " undefined reference to " or "launch failed binary not found"问题
    blockdev 设置文件预读大小
    宝宝语录
    CentOS修改主机名(hostname)
    subprocess报No such file or directory
    用ldap方式访问AD域的的错误解释
    英特尔的VTd技术是什么?
    This virtual machine requires the VMware keyboard support driver which is not installed
    Linux内核的文件预读详细详解
    UNP总结 Chapter 26~29 线程、IP选项、原始套接字、数据链路访问
  • 原文地址:https://www.cnblogs.com/binhy0428/p/5086063.html
Copyright © 2020-2023  润新知