当前位置: 首页 > news >正文

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

目录

  • 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。

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

相关文章:

  • list的模拟实现(万字解读+由浅入深)
  • 秒级使网站变灰,不改代码不上线,如何做到?
  • qt人员管理模块(模块化程序)功能块复制直接使用不冲突
  • 【项目_03】日历的回显、搭建热门精选、下拉加载更多、搜索框搭建 | 基于Vue3全家桶
  • 目标检测算法——YOLOv5/YOLOv7改进之结合特征提取网络RFBNet(涨点明显)
  • 【Spring系列】- Spring循环依赖
  • Java实验七
  • 图像处理:模糊图像判断
  • SNMP协议——网络管理概述
  • 家庭用户无线上网案例(AC通过三层口对AP进行管理)
  • Hbase的SQL接口之Phoenix使用心得
  • Linux-性能分析常用工具
  • 用html做一个漂亮的网站【茶文化12页】期末网页制作 HTML+CSS网页设计实例 企业文化网站制作
  • 【torch.utils.data.sampler】采样器的解析和使用
  • 你绝对想象不到的端对端通信的几种方式
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • AWS实战 - 利用IAM对S3做访问控制
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Java|序列化异常StreamCorruptedException的解决方法
  • java2019面试题北京
  • JavaScript新鲜事·第5期
  • Java深入 - 深入理解Java集合
  • Quartz初级教程
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • vue的全局变量和全局拦截请求器
  • 官方解决所有 npm 全局安装权限问题
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • 选择阿里云数据库HBase版十大理由
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • (C语言)字符分类函数
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (二十四)Flask之flask-session组件
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)计算机毕业设计大学生兼职系统
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (四)Controller接口控制器详解(三)
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (一)UDP基本编程步骤
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .net MVC中使用angularJs刷新页面数据列表
  • ??eclipse的安装配置问题!??
  • @javax.ws.rs Webservice注解
  • @vue/cli 3.x+引入jQuery
  • [1525]字符统计2 (哈希)SDUT
  • [20140403]查询是否产生日志
  • [BJDCTF2020]The mystery of ip1
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析
  • [bzoj2957]楼房重建
  • [EULAR文摘] 利用蛋白组学技术开发一项蛋白评分用于预测TNFi疗效