• python dict 字典


    字典是通过hash表的原理实现的,每个元素都是一个键值对,通过元素的键计算出一个唯一的哈希值,这个hash值决定了元素的地址,因此为了保证元素地址不一样,必须保证每个元素的键和对应的hash值是完全不同的,并且键的类型必须是不可修改的,所以键的类型可以使数值,字符串常量或元组,但不能是列表,因为列表是可以被修改的。

    所以字典具有下列特性:

    1、元素的查询和插入操作很快,基本上是常数级别

    2、占用内存较大,采用的是空间换时间的方法

    参考地址:http://www.cnblogs.com/xianwang/p/4970448.html

    字典的初始化

    下面的方法都是等价的

    d={'a':1, 'b':2, 'c':3}

    d=dict({'a':1, 'b':2, 'c':3})

    d = dict([('a',1), ('b', 2), ('c', 3)])

    d = dict(a=1, b=2, c=3)

    d = dict(zip(['a', 'b', 'c'], [1,2,3]))#这个方法也可以用作将两个列表合并成一个字典

    赋值元素

    1、e = d#引用赋值,e、d始终是一样的

    2、e = d.copy()#值赋值,二者是没有关联的

    3、d.copy()是一个浅拷贝,当键值对的值遇到字典或者列表时,字典或列表还会随着原来的变化而变化,此时的值相当于元组或列表的引用或指针,而不是其本身,指向的元组或列表其实还是原来的。使用copy模块的deepcopy()方法可以避免这种情况。

    import copy
    
    dict1 = {'a': [1, 2], 'b': 3}
    dict2 = dict1
    dict3 = dict1.copy()
    dict4 = copy.deepcopy(dict1)
    
    dict1['b'] = 'change'
    dict1['a'].append('change')
    
    print dict1  # {'a': [1, 2, 'change'], 'b': 'change'}
    print dict2  # {'a': [1, 2, 'change'], 'b': 'change'}
    print dict3  # {'a': [1, 2, 'change'], 'b': 3}
    print dict4  # {'a': [1, 2], 'b': 3}

    增加元素

    1、d['d'] = 4#直接通过下标添加,如果该键值已存在,那就是修改元素了,当然也可以访问元素

    删除元素

    1、d.clear()#删除d中的所有元素

    2、d.pop('a')#删除键值为‘a’的元素

    3、del d['a']#删除键值为‘a’的元素

    遍历元素

    for k in d:

      print 'd[%s]=' % k,d[k]

    for k,v in d.items():

      print 'd[%s]=' % k,v

    for k,v in d.iteritems():

      print 'd[%s]=' % k,v

    for k,v in d.viewitems():

      print 'd[%s]=' % k,v

    items(),iteritems()和viewitems()区别

    参考地址:http://www.jb51.net/article/54116.htm

    python2.x的 items() 就是返回一个像上面那样的包含dict所有元素的list,但是由于这样太浪费内存,所以后来就加入了(注:在Python 2.2开始出现的)iteritems(), iterkeys(), itervalues()这一组函数,用于返回一个 iterator 来节省内存,但是迭代器不能反映dict在调用这个函数之后的变化。所以就添加了viewitems(),始终代表最新的元素。Python3.x中只有一个items函数,这个函数与2.x中的viewitems()等价。

    参考链接:http://www.tuicool.com/articles/rAzQfq

    字典合并

    1、dd = dict(dict1.items() + dict2.items())

    但是这种效率不高,通过上面的分析指导,它实际上是调用items先返回对应的列表,然后执行列表相加,最后再按照列表初始化成字典的形式进行初始化

    2、dd = dict(dict1, **dict2)

    字典的键必须是字符串。在Python 2(解释器是CPython)中,我们可以使用非字符串作为键,但别被蒙骗了:这种hack只是凑巧在使用标准CPython运行环境的Python 2中才有效。

    上面语句相当于

    dd = dict1.copy()

    dd.update(dict2)

    其中的dd.update(dict2)又相当于

    for k in dict2

      dd[k] = dict2[k]

    可知update的作用不仅可以添加不存在的元素,还能修改已存在的键的元素值。

    并且通过上面知道通过update和for...in也是可以合并字典的。

    排序

    #调用sorted()排序
    dict = {"a" : "apple", "b" : "grape", "c" : "orange", "d" : "banana"}
    print dict  
    #按照key排序 
    print sorted(dict.items(), key=lambda d: d[0])
    #按照value排序 
    print sorted(dict.items(), key=lambda d: d[1])

    ls = list(dict.keys())
    ls.sort()
    for k in ls:
        print(k, dict[k])

    for k in sorted(dict.keys()):
       print(k, dict[k])
  • 相关阅读:
    通过python连接数据库以及操作
    切片
    文件的内容读写(二)
    文件的内容读写(一)
    python数据类型(四)之嵌套类型
    python数据类型(三)之字典类型
    python数据类型(二)之数组和数组函数
    Python的内存管理
    *args 和 **kwargs 的区别
    python的命名空间
  • 原文地址:https://www.cnblogs.com/suntp/p/6478261.html
Copyright © 2020-2023  润新知