• 3.1数据结构和序列(利用Python进行数据分析)


    4 字典

    dict(字典)可能是Python内建数据结构中最重要的。

    它更为常用的名字是哈希表或者是关联数组。字典是拥有灵活尺寸的键值对集合,其中键和值都是Python对象。用大括号 {} 是创建字典的一种方式,在字典中用逗号将键值对分隔:

    empty_dict = {}
    d1 = {'a' : 'some value', 'b' : [1, 2, 3, 4]}
    print(d1)
    
    Out[103]: {'a': 'some value', 'b': [1, 2, 3, 4]}
    
    • 1
    • 2
    • 3
    • 4
    • 5

    访问、插入或设置字典中的元素

    In [104]: d1[7] = 'an integer'
    
    In [105]: d1
    Out[105]: {'a': 'some value', 'b': [1, 2, 3, 4], 7: 'an integer'}
    
    In [106]: d1['b']
    Out[106]: [1, 2, 3, 4]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    检查字典是否含有一个键:

    In [107]: 'b' in d1
    Out[107]: True
    
    • 1
    • 2

    使用del关键字或pop方法删除值,pop方法会在删除的同时返回被删的值,并删除键:

    In [108]: d1[5] = 'some value'
    
    In [109]: d1
    Out[109]: 
    
    {'a': 'some value',
     'b': [1, 2, 3, 4],
     7: 'an integer',
     5: 'some value'}
    
    In [110]: d1['dummy'] = 'another value'
    
    In [111]: d1
    Out[111]: 
    {'a': 'some value',
     'b': [1, 2, 3, 4],
     7: 'an integer',
     5: 'some value',
     'dummy': 'another value'}
    
    In [112]: del d1[5]
    
    In [113]: d1
    Out[113]: 
    {'a': 'some value',
     'b': [1, 2, 3, 4],
     7: 'an integer',
     'dummy': 'another value'}
    
    In [114]: ret = d1.pop('dummy')
    
    In [115]: ret
    Out[115]: 'another value'
    
    In [116]: d1
    Out[116]: {'a': 'some value', 'b': [1, 2, 3, 4], 7: 'an integer'}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    keys方法和values方法会分别为你提供字典键、值的迭代器。然而键值对并没有特定的顺序,这些函数输出的键、值都是按照相同的顺序:

    In [117]: list(d1.keys())
    Out[117]: ['a', 'b', 7]
    
    In [118]: list(d1.values())
    Out[118]: ['some value', [1, 2, 3, 4], 'an integer']
    
    • 1
    • 2
    • 3
    • 4
    • 5

    使用update方法将两个字典合并

    In [119]: d1.update({'b' : 'foo', 'c' : 12})
    
    In [120]: d1
    Out[120]: {'a': 'some value', 'b': 'foo', 7: 'an integer', 'c': 12}
    
    • 1
    • 2
    • 3
    • 4

    update方法改变了字典中元素位置,因此对于任何原字典中已经存在的键,如果传给update方法的数据也含有相同的键,则它的值将会被覆盖。

    4.1 从序列生成字典

    当有两个序列要在字典中按元素配对。

    In [121]: mapping = dict(zip(range(5), reversed(range(5))))
    
    In [122]: mapping
    Out[122]: {0: 4, 1: 3, 2: 2, 3: 1, 4: 0}
    
    • 1
    • 2
    • 3
    • 4

    4.2 默认值

    通常情况下,会有这样的代码逻辑:

    if key in some_dict:
        value = some_dict[key]
    else:
        value = default_value
    
    • 1
    • 2
    • 3
    • 4

    不过字典的get方法和pop方法可以返回一个默认值,因此上述的 if-else 代码块可以被简写为:

    value = some_dict.get(key, default_value)
    
    • 1

    带有默认值的get方法会在key参数不是字典的键时返回None,而pop会抛出异常。

    一个常见的场景是字典中的值集合通过设置,成为另一种集合,比如列表。

    举个例子,将字词组成的列表,根据首字母分类为包含列表的字典:

    In [123]: words = ['apple', 'bat', 'bar', 'atom', 'book']
    
    In [124]: by_letter = {}
    
    In [125]: for word in words:
       .....:     letter = word[0]
       .....:     if letter not in by_letter:
       .....:         by_letter[letter] = [word]
       .....:     else:
       .....:         by_letter[letter].append(word)
       .....:
    
    In [126]: by_letter
    Out[126]: {'a': ['apple', 'atom'], 'b': ['bat', 'bar', 'book']}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    字典的setdefault方法就是为了这个目的而产生的。上述的for循环语句可以被写为:

    for word in words:
        letter = word[0]
        by_letter.setdefault(letter, []).append(word)
    
    • 1
    • 2
    • 3

    内建的集合模块有一个非常有用的类,defaultdict

    这个类使得上述目的实现更为简单。

    想要生成符合要求的字典,你可以向字典中传入类型,或能在各位置生成默认值的函数:

    from collections import defaultdict
    by_letter = defaultdict(list)
    for word in words:
        by_letter[word[0]].append(word)
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    Android OOM 问题探究 -- 从入门到放弃
    文章分类列表进行查询(实体类日期格式设置)
    BP神经网络
    FPGA project :dds
    如何开通 Medium会员
    java-net-php-python-net本科生毕业设计选导师系统演示录像2019计算机毕业设计程序
    皮皮APP语音派对策划师:千亿娱乐社交下的百万自由职业者
    编程语言常识
    STM32速成笔记—SPI通信
    goroutine 调度
  • 原文地址:https://blog.csdn.net/weixin_46713695/article/details/128181510