3.1数据结构和序列(利用Python进行数据分析)
admin
2024-03-18 12:40:18

目录

  • 4 字典
    • 4.1 从序列生成字典
    • 4.2 默认值

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]}

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

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]

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

In [107]: 'b' in d1
Out[107]: True

使用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'}

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']

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

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

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}

4.2 默认值

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

if key in some_dict:value = some_dict[key]
else:value = default_value

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

value = some_dict.get(key, default_value)

带有默认值的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']}

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

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

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

这个类使得上述目的实现更为简单。想要生成符合要求的字典,你可以向字典中传入类型或能在各位置生成默认值的函数:

相关内容

热门资讯

存储芯片成本暴涨230%!iP...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! (来源:网易科技)受...
内存价格疯涨,iQOO“买芯片...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! (来源:网易科技)进...
国家电网计划投资4万亿 “十五... 新华社图 国家电网1月15日宣布,“十五五”期间公司固定资产投资预计达到4万亿元,较“十四五...
火星情报局160513期开始那... 汪涵主持的推理脱口秀《火星情报局》昨晚更新了最新或2023(历届)0513期,在开始的那段视频中最后...
火星情报局160513期为什么... 汪涵首档网络综艺秀《火星情报局》昨晚更新0513期,汪涵和薛之谦搭档了前面六期之后昨晚却不在现场,而...