• list

    list是一种有序的集合,可以随时添加和删除其中的元素。

    比如,列出班里所有同学的名字,就可以用一个list表示:

  1. >>> classmates = ['Michael', 'Bob', 'Tracy']
  2. >>> classmates
  3. ['Michael', 'Bob', 'Tracy']
  • 用len()函数可以获得list元素的个数:
  1. >>> len(classmates)
  2. 3
  • 用append()函数可以往list中追加元素到末尾:
  1. >>> classmates.append('Adam')
  2. >>> classmates
  3. ['Michael', 'Bob', 'Tracy', 'Adam']
  • 用insert()函数可以在特定的位置插入元素:
  1. >>> b_list
  2. ['foo', 'peekaboo', 'baz']
  3. >>> b_list.insert(1, 'red')
  4. >>> b_list
  5. O['foo', 'red', 'peekaboo', 'baz']
  • 用pop()函数可以删除list末尾的元素,要删除指定位置的元素,用pop(i)方法,其中i是索引位置:
  1. >>> classmates.pop()
  2. 'Adam'
  3. >>> classmates
  4. ['Michael', 'Jack', 'Bob', 'Tracy']
  • tuple

    另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改。不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。

    tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。比如我在tuple里面设置了一个list,我改变这个list是可以的,但是tuple所指向的这个list是永远不会变的。

  • 用tuple可以将任意序列或迭代器转换成元组:

  1. In [5]: tuple([4, 0, 2])
  2. Out[5]: (4, 0, 2)
  3. In [6]: tup = tuple('string')
  4. In [7]: tup
  5. Out[7]: ('s', 't', 'r', 'i', 'n', 'g')
  • 如果你想将元组赋值给类似元组的变量,Python会试图拆分等号右边的值:
  1. In [15]: tup = (4, 5, 6)
  2. In [16]: a, b, c = tup
  3. In [17]: b
  4. Out[17]: 5
  • python允许从元组的开头“摘取”几个元素。它使用了特殊的语法*rest,这也用在函数签名中以抓取任意长度列表的位置参数:
  1. In [29]: values = 1, 2, 3, 4, 5
  2. In [30]: a, b, *rest = values
  3. In [31]: a, b
  4. Out[31]: (1, 2)
  5. In [32]: rest
  6. Out[32]: [3, 4, 5]
  • 用count()函数可以统计某个值得出现频率:
  1. In [34]: a = (1, 2, 2, 2, 3, 4, 2)
  2. In [35]: a.count(2)
  3. Out[35]: 4
  • 用remove()函数会先寻找第一个值并除去:
  1. In [52]: b_list
  2. Out[52]: ['foo', 'red', 'baz', 'dwarf', 'foo']
  3. In [53]: b_list.remove('foo')
  4. In [54]: b_list
  5. Out[54]: ['red', 'baz', 'dwarf', 'foo']
  • 用in()函数可以检查列表是否包含某个值:
  1. In [55]: 'dwarf' in b_list
  2. Out[55]: True
  • 用extend()函数可以追加多个元素:
  1. In [58]: x = [4, None, 'foo']
  2. In [59]: x.extend([7, 8, (2, 3)])
  3. In [60]: x
  4. Out[60]: [4, None, 'foo', 7, 8, (2, 3)]
  • 用sort()函数可以将一个列表原地排序(不创建新的对象):
  1. In [61]: a = [7, 2, 5, 1, 3]
  2. In [62]: a.sort()
  3. In [63]: a
  4. Out[63]: [1, 2, 3, 5, 7]
  • sort()有一些选项,有时会很好用。其中之一是二级排序key,可以用这个key进行排序。例如,我们可以按长度对字符串进行排序:
  1. In [64]: b = ['saw', 'small', 'He', 'foxes', 'six']
  2. In [65]: b.sort(key=len)
  3. In [66]: b
  4. Out[66]: ['He', 'saw', 'six', 'small', 'foxes']
  • bisect模块支持二分查找,和bisect向已排序的列表插入值。bisect.bisect可以找到插入值后仍保证排序的位置,bisect.insort是向这个位置插入值:
  1. In [67]: import bisect
  2. In [68]: c = [1, 2, 2, 2, 3, 4, 7]
  3. In [69]: bisect.bisect(c, 2)
  4. Out[69]: 4
  5. In [70]: bisect.bisect(c, 5)
  6. Out[70]: 6
  7. In [71]: bisect.insort(c, 6)
  8. In [72]: c
  9. Out[72]: [1, 2, 2, 2, 3, 4, 6, 7]
  • 用切边可以选取大多数序列类型的一部分,切片的基本形式是在方括号中使用start:stop。(左闭右开)
  1. In [73]: seq = [7, 2, 3, 7, 5, 6, 0, 1]
  2. In [74]: seq[1:5]
  3. Out[74]: [2, 3, 7, 5]
  • 切片也可以被序列赋值:
  1. In [75]: seq[3:4] = [6, 3]
  2. In [76]: seq
  3. Out[76]: [7, 2, 3, 6, 3, 5, 6, 0, 1]
  • 切片也可以被序列赋值,start和stop都可以被省略,省略之后,分别默认序列的开头和结尾,负数表明从后向前切片。
  1. In [77]: seq[:5]
  2. Out[77]: [7, 2, 3, 6, 3]
  3. In [80]: seq[-6:-2]
  4. Out[80]: [6, 3, 5, 6]
  • 在第二个冒号后面使用step,可以隔一个取一个元素:
  1. In [81]: seq[::2]
  2. Out[81]: [7, 3, 3, 6, 1]
  • 一个聪明的方法是使用-1,它可以将列表或元组颠倒过来:
  1. In [82]: seq[::-1]
  2. Out[82]: [1, 0, 6, 5, 3, 6, 3, 2, 7]
  • 迭代一个序列时,你可能想跟踪当前项的序号,Python内建了一个enumerate函数,可以返回(i,value)元组序列。
  1. for i, value in enumerate(collection):
  2. # 简单来说,这个enumerate就是为collection提供出了一个对应的的value(序列号)。
  1. In [83]: some_list = ['foo', 'bar', 'baz'] #我设置出了一个some_list的list
  2. In [84]: mapping = {} #而这里我设置出了一个空字典mapping{}
  3. In [85]: for i, v in enumerate(some_list):
  4. ....: mapping[v] = i #而在这里,我就将some_list中的i和value赋予给了字典mapping,其中的i是元素的索引,value是元素的值。
  5. #这里的mapping[v] = i,是一个字典的写法,如mapping[foo] = 0,依次迭代。
  6. In [86]: mapping
  7. Out[86]: {'bar': 1, 'baz': 2, 'foo': 0}
  • sorted函数可以从任意序列的元素返回一个新的排好序的列表:
  1. In [87]: sorted([7, 1, 2, 6, 0, 3, 2])
  2. Out[87]: [0, 1, 2, 2, 3, 6, 7]
  3. In [88]: sorted('horse race')
  4. Out[88]: [' ', 'a', 'c', 'e', 'e', 'h', 'o', 'r', 'r', 's']
  • zip函数可以将多个列表、元组或其它序列成对组合成一个元组列表:
  1. In [89]: seq1 = ['foo', 'bar', 'baz']
  2. In [90]: seq2 = ['one', 'two', 'three']
  3. In [91]: zipped = zip(seq1, seq2)
  4. In [92]: list(zipped)
  5. Out[92]: [('foo', 'one'), ('bar', 'two'), ('baz', 'three')]
  • zip可以处理任意多的序列,元素的个数取决于最短的序列:
  1. In [93]: seq3 = [False, True]
  2. In [94]: list(zip(seq1, seq2, seq3))
  3. Out[94]: [('foo', 'one', False), ('bar', 'two', True)]
  • zip的常见用法之一是同时迭代多个序列,可能结合enumerate使用:
  1. In [95]: for i, (a, b) in enumerate(zip(seq1, seq2)): #我要将zip(seq1,seq2)跟踪当前项的序号,返回(i,(a,b))元组序列,
  2. ....: print('{0}: {1}, {2}'.format(i, a, b)) #str.format()函数:格式化字符串的函数,使用方法见下。
  3. ....:
  4. '''
  5. >>>"{} {}".format("hello", "world") # 不设置指定位置,按默认顺序
  6. 'hello world'
  7. >>> "{0} {1}".format("hello", "world") # 设置指定位置
  8. 'hello world'
  9. >>> "{1} {0} {1}".format("hello", "world") # 设置指定位置
  10. 'world hello world'
  11. '''
  12. 0: foo, one
  13. 1: bar, two
  14. 2: baz, three
  • 给出一个“被压缩的”序列,zip可以被用来解压序列。也可以当作把行的列表转换为列的列表。这个方法看起来有点神奇:
  1. In [96]: pitchers = [('Nolan', 'Ryan'), ('Roger', 'Clemens'),
  2. ....: ('Schilling', 'Curt')]
  3. In [97]: first_names, last_names = zip(*pitchers)
  4. In [98]: first_names
  5. Out[98]: ('Nolan', 'Roger', 'Schilling')
  6. In [99]: last_names
  7. Out[99]: ('Ryan', 'Clemens', 'Curt')
  • reversed()函数可以从后向前迭代一个序列,切记reversed()是一个生成器(后面详细介绍),只有实体化(即列表或for循环)之后才能创建翻转的序列:
  1. In [100]: list(reversed(range(10)))
  2. Out[100]: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
  • 字典

    字典可能是Python最为重要的数据结构。它更为常见的名字是哈希映射或关联数组。它是键值对的大小可变集合,键和值都是Python对象。创建字典的方法之一是使用尖括号,用冒号分隔键和值:

  1. In [101]: empty_dict = {}
  2. In [102]: d1 = {'a' : 'some value', 'b' : [1, 2, 3, 4]}
  3. In [103]: d1
  4. Out[103]: {'a': 'some value', 'b': [1, 2, 3, 4]}
  • 你可以像访问列表或元组中的元素一样,访问、插入或设定字典中的元素;可以用检查列表和元组是否包含某个值的方法,检查字典中是否包含某个键;还可以用之前讲过的del关键字或pop方法(返回值的同时删除键)删除值:
  1. In [104]: d1[7] = 'an integer'
  2. In [105]: d1
  3. Out[105]: {'a': 'some value', 'b': [1, 2, 3, 4], 7: 'an integer'}
  4. In [106]: d1['b']
  5. Out[106]: [1, 2, 3, 4]
  6. In [108]: d1[5] = 'some value'
  7. In [109]: d1
  8. Out[109]:
  9. {'a': 'some value',
  10. 'b': [1, 2, 3, 4],
  11. 7: 'an integer',
  12. 5: 'some value'}
  13. In [110]: d1['dummy'] = 'another value'
  14. In [111]: d1
  15. Out[111]:
  16. {'a': 'some value',
  17. 'b': [1, 2, 3, 4],
  18. 7: 'an integer',
  19. 5: 'some value',
  20. 'dummy': 'another value'}
  21. In [112]: del d1[5]
  22. In [113]: d1
  23. Out[113]:
  24. {'a': 'some value',
  25. 'b': [1, 2, 3, 4],
  26. 7: 'an integer',
  27. 'dummy': 'another value'}
  28. In [114]: ret = d1.pop('dummy')
  29. In [115]: ret
  30. Out[115]: 'another value'
  31. In [116]: d1
  32. Out[116]: {'a': 'some value', 'b': [1, 2, 3, 4], 7: 'an integer'}
  • key和values是字典的键和值的迭代器方法。虽然键值对没有顺序,这两个方法可以用相同的顺序输出键和值:
  1. In [116]: d1
  2. Out[116]: {'a': 'some value', 'b': [1, 2, 3, 4], 7: 'an integer'}
  3. In [117]: list(d1.keys())
  4. Out[117]: ['a', 'b', 7]
  5. In [118]: list(d1.values())
  6. Out[118]: ['some value', [1, 2, 3, 4], 'an integer']
  • 用update方法可以将一个字典与另一个融合:
  1. In [119]: d1.update({'b' : 'foo', 'c' : 12})
  2. In [120]: d1
  3. Out[120]: {'a': 'some value', 'b': 'foo', 7: 'an integer', 'c': 12}
  • 常常,你可能想将两个序列配对组合成字典。下面是一种写法:
  1. mapping = {}
  2. for key, value in zip(key_list, value_list):
  3. mapping[key] = value

因为字典本质上是2元元组的集合,dict可以接受2元元组的列表:

  1. In [121]: mapping = dict(zip(range(5), reversed(range(5))))
  2. #reversed 函数返回一个反转的迭代器,seq -- 要转换的序列,可以是 tuple, string, list 或 range。
  3. In [122]: mapping
  4. Out[122]: {0: 4, 1: 3, 2: 2, 3: 1, 4: 0}
  • 默认值

第一章:Python的数据结构、函数和文件的更多相关文章

  1. [Python笔记][第一章Python基础]

    2016/1/27学习内容 第一章 Python基础 Python内置函数 见Python内置函数.md del命令 显式删除操作,列表中也可以使用. 基本输入输出 input() 读入进来永远是字符 ...

  2. (python数据分析)第03章 Python的数据结构、函数和文件

    本章讨论Python的内置功能,这些功能本书会用到很多.虽然扩展库,比如pandas和Numpy,使处理大数据集很方便,但它们是和Python的内置数据处理工具一同使用的. 我们会从Python最基础 ...

  3. 第一章 Python程序语言简介

    第一节 Python概述 1. 什么是Python Python是一种 解释型.面向对象.动态数据类型 的高级程序设计语言.由Guido van Rossum与1989年发明,第一个公开发行版本发行于 ...

  4. 【学习笔记】第一章 python安全开发简介

    1.1为什么黑客喜欢用python? python为我们提供了非常完善的基础代码库,覆盖了网络.文件.GUI.数据库.文本等大量内容,被形象的称为“”内置电池“”,用python开发,许多功能不必从零 ...

  5. 第9.7节 Python使用write函数写入文件内容

    一. 语法 write(data) data为要写入的数据,可以为字符串str类型,也可以是bytes类型. 返回值为实际写入的数据数,在写入数据为str类型时,该数据为实际写入的UNIOCODE字符 ...

  6. 第一章python 简介

    python语言是目前最流行的编程语言之一,在笔者写这篇文章的前一周,2018年的IEEE的编程语言排行出来了,python又雄踞第一. Python 强势霸榜第一名!排名第二的 C++ 得分是 98 ...

  7. 第一章 python中重要的数据结构(上)

    最近,由于工作需要,使用python开发公司的运维自动化平台,所以找本书来并结合官方手册,开始python的学习之旅. 一.列表 [含义]:列表用中括号表示,通过逗号进行分隔一组数据(可以为不同的数据 ...

  8. 【Flask】 python学习第一章 - 4.0 钩子函数和装饰器路由实现 session-cookie 请求上下文

    钩子函数和装饰器路由实现 before_request 每次请求都会触发 before_first_requrest  第一次请求前触发 after_request  请求后触发 并返回参数 tear ...

  9. 第一章 Python 基础

    1. 为什么学习 Python? 答题路线:a.python的优点,b.python的应用领域广 具体: 优点 1.python语法非常优雅,简单易学 2.免费开源 3.跨平台,可以自由移植 4.可扩 ...

  10. python 集合、函数和文件操作

    1.set集合 set集合是一个无序.不可重复.可嵌套的序列,基本功能是进行成员关系测试和删除重复元素,可以使用大括号({})或者 set()函数创建集合,注意:创建一个空集合必须用 set() 而不 ...

随机推荐

  1. java并发问题总结

    1.java中产生并发问题的主要原因有哪三个? 原子性.可见性和有序性 2.什么是java内存模型? java虚拟机规范中用来屏蔽掉各种硬件和操作系统内存访问差异,java内存模型的主要目标是定义程序 ...

  2. css 实现球里装水

    <template> <div class="container">     <div class="wave"></ ...

  3. Typora+PicGO+Gitee实现图床功能

    Typora+PicGO+Gitee实现图床功能 版本 typora(0.9.86) PicGo(2.3.0) 主要参考链接 出现问题就先看看这个 问题一 打开PicGo后安装github插件会一直安 ...

  4. 控制Python浮点数输出位数

    技术背景 在Python的一些长效任务中,不可避免的需要向文本文件.二进制文件或者数据库中写入一些数据,或者是在屏幕上输出一些文本,此时如何控制输出数据的长度是需要我们注意的一个问题.比如对于一个二进 ...

  5. 简单说一说jsonp原理

    背景:由于浏览器同源策略的限制,非同源下的请求,都会产生跨域问题,jsonp即是为了解决这个问题出现的一种简便解决方案. 同源策略即:同一协议,同一域名,同一端口号.当其中一个不满足时,我们的请求即会 ...

  6. 记一次jenkins发送邮件报错 一直报错 Could not send email as a part of the post-build publishers问题

    写在前面 虽然Jenkins是开源.免费的,好处很多,但有些功能上的使用,我个人还是很不喜欢,感觉用起来特别麻烦.繁琐. 为什么? 就拿这个邮件配置来说吧,因重装系统,电脑需要配置很多东西,结果今天就 ...

  7. JavaScript函数中的arguments对象

    ECMAScript标准中,每个函数都有一个特殊的内置对象arguments.arguments对象是一个类Array对象(object),用以保存函数接收到的实参副本. 一.内置特性 说它是一个内置 ...

  8. TCP 连接的建立 & 断开

    TCP 连接的建立过程 一开始,客户端和服务端都处于 close 状态. 先是服务端监听某个端口,此时服务端处于 listen 状态. 这个时候客户端就可以发送连接请求报文了. 第一次握手 客户端会主 ...

  9. XCTF练习题---WEB---command_execution

    XCTF练习题---WEB---command_execution flag:cyberpeace{69383c056080bd6cd649578894d1d377} 解题步骤: 1.观察题目,打开场 ...

  10. 【MyBatis】多关键字的模糊查询

    目录 情景分析 题目 要求 相关代码 Mapper.java Impl.java mapper.xml test.java 思路分析 1.最开始,参数没有使用List,引起的问题 2.Mybatis的 ...