• 浅谈python中字典


    1.字典的定义方式有以下:

        a=dict(one=1,two=2,three=3)
        b={'one':1,'two':2,'three':3}
        c=dict(zip(['one','two','three'],[1,2,3]))
        d=dict([('two',2),('one',1),('three',3)])
            e=dict({'three':3,'one':1,'two':2})
    View Code

    其中这四种定义方式完全等效,有一点需要牢记,标准库中所有的映射类型都是通过字典(dict)来实现,其中只有可散列(hashable)类型才能作为字典的键。

    可散列数据类型简单来说,如果一个数据是可散列数据类型,那么,在这个对像生命周期中,其值保持不变。一般来说,不可变数据类型是可散列数据类型,用户自定义的数据类型也是可散列数据类型,散列值就是其id()返回值。

    2.字典推导:

    除了上述构造方式可以创建字典外,还可以采用字典推导的方式:

    DIAL_CODES=[(86,'China'),
                (91,'India'),
                (1,'United States'),
                (62,'Indonesia'),
                (81,'Japan')]
    country_code={country:code for code,country in DIAL_CODES}#定义字典推导
    print(country_code)
    View Code

    下面总结以下python中常见类型的推导方式:

    1)列表推导:[expression for item in iterable]

    number_list=[num for num in range(1,4)]#列表推导
    print(number_list)    #[1, 2, 3]

    2)集合推导:{expersion for expersion in iterable}

    a_set={number for number in range(1,6) if number%2==0}#列表推导,其中所有推导方式都可以在其后面加入判断方式
    print(a_set) #{2, 4}

    3)生成器表达式:与列表推导类似,只是将‘[]’换成‘()’,

    colors=['black', 'white'] 
    sizes=['S', 'M', 'L']
    for tshirt in ('%s %s'%(c,s) for c in colors for s in sizes):
        print(tshirt)
    # black S
    # black M
    # black L
    # white S
    # white M
    # white L 

    3.字典查找:d={'a':1,'b':2}

    在进行查找时,若直接调用d[..]方式进行查找,当找不到对应键时会报错,可以通过d.get(k,default)//若未查到对应键,返回默认default值。

    当然,还有其他方法,如:

    通过定义defaultdict类型代替普通dict类型,或自定义一个类,该类继承自dict类型,并在该类型中实现__missing__方法。

    import collections
    
    DIAL_CODES=[(86,'China'),
                (91,'India'),
                (1,'United States'),
                (62,'Indonesia'),
                (81,'Japan')]
    d=collections.defaultdict(list,DIAL_CODES)#在字典查询时若键不存在会返回指定的list类型
    print(d[86])#China
    print(d['c'])#[]
    class StrKeyDict0(dict):
        def __missing__(self,key):  #自定义类型,处理键未找到时,的处理方式
            return "键:" +key +" 未找到"
    
    DIAL_CODES=[(86,'China'),
                (91,'India'),
                (1,'United States'),
                (62,'Indonesia'),
                (81,'Japan')]
    
    d=StrKeyDict0(DIAL_CODES)
    print(d['62'])  #键:62 未找到,因为字典中的键为int类型

    下面看一下__missing__():

    所有的映射在找不到对应的键时都会牵扯到该方法,其中该方法只会被__getitem__调用(d[k])。

    4.字典的变种

    4.1 collections.OrderedDict:

    这个类型在添加键时会保持顺序,因此键的迭代顺序是一致的。有属性popitem(last=True),移除并返回一个(key,value),  last=True 先进后出,否则先进先出。

    import collections
    
    tru=[('a',1),('b',2),('c',3),('d',4)]
    d=collections.OrderedDict(tru)
    d.move_to_end('b',last=False)  #将键默认移到末尾(last=True),last=False,移到开头
    print(','.join(d.keys()))      #b,a,c,d
    print(d.popitem(last=False))   #默认返回字典最后一个(last=True)('d', 4),last=False返回第一个

    4.2 collections.ChainMap:

    该类型可以容纳数个不同的映射对象,然后在进行键查找时,这些对象会被当成一个整体逐个查找,直到所有键都被找到。

    常见属性:

    maps:一个可以更新的映射列表。这个列表是按照第一次搜索到最后一次搜索的顺序组织的。它是仅有的存储状态,可以被修改。列表最少包含一个映射。

    new_child(m=None):返回一个ChainMap新类,后面跟着当前实例的全部映射,如果 m 被指定,它就成为不同新的实例,就是在所有映射前加上 m,如果没有指定,就加上一个空字典。

    parents:属性返回一个新的ChainMap包含当前实例的映射。

    import collections
    
    baseline = {'music': 'bach', 'art': 'rembrandt'}
    adjustments = {'art': 'van gogh', 'opera': 'carmen'}
    print(list(collections.ChainMap(baseline,adjustments)))#返回字典中所有的键,从最后开始查找
    d=collections.ChainMap(baseline,adjustments)
    print(d.parents)#返回ChainMap中除了第一个外的所有字典
    print(d.maps[1])#返回字典adjustments
    print(d.new_child())#ChainMap({}, {'music': 'bach', 'art': 'rembrandt'}, {'art': 'van gogh', 'opera': 'carmen'})

    4.3 collections.Counter:

    一个 Counter 是一个 dict 的子类,用于计数可哈希对象。它是一个集合,元素像字典键(key)一样存储,它们的计数存储为值。计数可以是任何整数值,包括0和负数。

    除了dict方法外,还有以下其他方法:

    elements():返回一个迭代器,每个元素将重复出现计数值所指定次数,元素会按顺序返回,如果一个元素的计数小于1,或0会忽略。most_common(n)返回一个列表,包含n个最常见的元素及出现次数,按高低进行排序。

    import collections
    
    d=collections.Counter(a=4,c=2,b=3,d=0,e=-2)
    for n in d.elements():
        print(n) # a a a a c c b b b
    
    d1=collections.Counter('abracadabra').most_common(3)
    print(d1)  #[('a', 5), ('b', 2), ('r', 2)]

    5.集合(看帮助文档)

    set 对象是由具有唯一性的 hashable 对象所组成的无序多项集。

    常见的用途包括成员检测、从序列中去除重复项以及数学中的集合类计算,例如交集、并集、差集与对称差集等等。

    set 类型是可变的 --- 其内容可以使用 add() 和 remove() 这样的方法来改变。 由于是可变类型,它没有哈希值,且不能被用作字典的键或其他集合的元素。 frozenset 类型是不可变并且为 hashable --- 其内容在被创建后不能再改变;因此它可以被用作字典的键或其他集合的元素。

    集合的数学运算:这些方法或者会生成新集合,或者会在条 件允许的情况下就地修改集合。

      

      

      

  • 相关阅读:
    FPGA STA(静态时序分析)
    Github实例教程-创建库、创建主页
    【JS】两种计时器/定时器
    【java】 获取计算机信息及Java信息
    【java 上传+下载】
    【POI xls】解析xls遇到的问题
    【jackson 异常】com.fasterxml.jackson.databind.JsonMappingException异常处理
    【tomcat 无法部署】svn上下载的maven项目无法部署到tomcat中
    【jQuery 冻结任意行列】冻结任意行和列的jQuery插件
    【JSON 注解】JSON循环引用2----JSON注解@JsonIgnoreProperties+JAVA关键字transient+后台对象与JSON数据的格式互相转化
  • 原文地址:https://www.cnblogs.com/2019zjp/p/11823728.html
Copyright © 2020-2023  润新知