参考文章:

Python3 数据结构

Day008_01:数据结构补充

补充下数据结构方面的知识点。

1、列表list

Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能。

以下是 Python 中列表的方法:

方法 描述
list.append(x) 把一个元素添加到列表的结尾,相当于 a[len(a):] = [x]。
list.extend(L) 通过添加指定列表的所有元素来扩充列表,相当于 a[len(a):] = L。
list.insert(i, x) 在指定位置插入一个元素。第一个参数是准备插入到其前面的那个元素的索引,例如 a.insert(0, x) 会插入到整个列表之前,而 a.insert(len(a), x) 相当于 a.append(x) 。
list.remove(x) 删除列表中值为 x 的第一个元素。如果没有这样的元素,就会返回一个错误。
list.pop([i]) 从列表的指定位置移除元素,并将其返回。如果没有指定索引,a.pop()返回最后一个元素。元素随即从列表中被移除。(方法中 i 两边的方括号表示这个参数是可选的,而不是要求你输入一对方括号,你会经常在 Python 库参考手册中遇到这样的标记。)
list.clear() 移除列表中的所有项,等于del a[:]。
list.index(x) 返回列表中第一个值为 x 的元素的索引。如果没有匹配的元素就会返回一个错误。
list.count(x) 返回 x 在列表中出现的次数。
list.sort() 对列表中的元素进行排序.
list.reverse() 倒排列表中的元素。
list.copy() 返回列表的浅复制,等于a[:]。

下面示例演示了列表的大部分方法:

  1. a = [66.25, 333, 333, 1, 1234.5]
  2. print(a.count(333), a.count(66.25), a.count('x'))
  3. a.append(123)
  4. a.insert(2, -1)
  5. print(a)
  6. print(a.index(333))
  7. a.remove(333)
  8. print(a)
  9. a.reverse()
  10. print(a)
  1. 2 1 0
  2. [66.25, 333, -1, 333, 1, 1234.5, 123]
  3. 1
  4. [66.25, -1, 333, 1, 1234.5, 123]
  5. [123, 1234.5, 1, 333, -1, 66.25]

1.1 将列表当作堆栈使用

列表方法使得列表可以很方便的作为一个堆栈来使用,堆栈作为特定的数据结构,最先进入的元素最后一个被释放(后进先出)。用 append() 方法可以把一个元素添加到堆栈顶。用不指定索引的 pop() 方法可以把一个元素从堆栈顶释放出来。例如:

  1. stack = [3, 4, 5]
  2. stack.append(6)
  3. stack.append(7)
  4. print(stack)
  5. print(stack.pop())
  6. print(stack)
  7. print(stack.pop())
  8. print(stack.pop())
  9. print(stack)
  1. [3, 4, 5, 6, 7]
  2. 7
  3. [3, 4, 5, 6]
  4. 6
  5. 5
  6. [3, 4]

1.2 将列表当作队列使用

也可以把列表当做队列用,只是在队列里第一加入的元素,第一个取出来;但是拿列表用作这样的目的效率不高。在列表的最后添加或者弹出元素速度快,然而在列表里插入或者从头部弹出速度却不快(因为所有其他的元素都得一个一个地移动)。

  1. from collections import deque
  2. quene = deque(["Eric","John","Michael"])
  3. quene.append("Terry")
  4. quene.append("Graham")
  5. print(quene.popleft())
  6. quene.popleft()
  7. print(quene)
  1. Eric
  2. deque(['Michael', 'Terry', 'Graham'])

1.3 列表推导式

列表推导式提供了从序列创建列表的简单途径。通常应用程序将一些操作应用于某个序列的每个元素,用其获得的结果作为生成新列表的元素,或者根据确定的判定条件创建子序列。

每个列表推导式都在 for 之后跟一个表达式,然后有零到多个 for 或 if 子句。返回结果是一个根据表达从其后的 for 和 if 上下文环境中生成出来的列表。如果希望表达式推导出一个元组,就必须使用括号。

这里我们将列表中每个数值乘三,获得一个新的列表:

  1. vec = [2, 4, 6]
  2. a = [3 * x for x in vec]
  3. print(a)
  4. b = [[x, x ** 2 ] for x in vec]
  5. print(b)
  6. freshfruits = [' banana ', ' loganberry ', 'passion fruit '] # 对列表freshfruits中的每个成员一次调用
  7. c = [weapon.strip() for weapon in freshfruits]
  8. print(c)
  9. d = [x * 3 for x in vec if x > 3] # 使用if用具作为过滤器
  10. e = [x ** 3 for x in vec if x > 4]
  11. print(d)
  12. print(e)
  13. vec2 = [4, 3, -9]
  14. f = [x*y for x in vec for y in vec2]
  15. g = [x + y for x in vec for y in vec2]
  16. h = [vec[i]*vec2[i] for i in range(len(vec))]
  17. print(f)
  18. print(g)
  19. print(h)
  1. [6, 12, 18]
  2. [[2, 4], [4, 16], [6, 36]]
  3. ['banana', 'loganberry', 'passion fruit']
  4. [12, 18]
  5. [216]
  6. [8, 6, -18, 16, 12, -36, 24, 18, -54]
  7. [6, 5, -7, 8, 7, -5, 10, 9, -3]
  8. [8, 12, -54]

1.4 嵌套列表解析

Python的列表还可以嵌套。

以下实例展示了3X4的矩阵列表,并且将3*4的列表转换为4*3的列表

  1. matrix = [
  2. [1, 2, 3, 4],
  3. [5, 6, 7, 8],
  4. [9, 10, 11, 12],
  5. ]
  6. # 最笨的办法
  7. row1 = [a for [a, b, c, d] in matrix]
  8. row2 = [b for [a, b, c, d] in matrix]
  9. row3 = [c for [a, b, c, d] in matrix]
  10. row4 = [d for [a, b, c, d] in matrix]
  11. newlist = [row1, row2, row3, row4]
  12. print(newlist)
  13. # 第一种方法
  14. newlist1 = [[row[i] for row in matrix] for i in range(4)]
  15. print(newlist1)
  16. # 第二种方法
  17. newlist2 =[]
  18. for i in range(4):
  19. newlist2.append([row[i] for row in matrix])
  20. print(newlist2)
  21. # 第三种方法
  22. newlist3 = []
  23. for i in range(4):
  24. list_row = []
  25. for row in matrix:
  26. list_row.append(row[i])
  27. newlist3.append(list_row)
  28. print(newlist3)
  1. [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
  2. [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
  3. [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
  4. [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

1.5 del语句

使用 del 语句可以从一个列表中依索引而不是值来删除一个元素。这与使用 pop() 返回一个值不同。可以用 del 语句从列表中删除一个切割,或清空整个列表(我们以前介绍的方法是给该切割赋一个空列表)。例如:

  1. a = [-1, 1, 66.25, 333, 333, 1234.5]
  2. del a[0]
  3. print(a)
  4. del a[2:4]
  5. print(a)
  6. del a[:]
  7. print(a)
  1. [1, 66.25, 333, 333, 1234.5]
  2. [1, 66.25, 1234.5]
  3. []

2、元组和序列

元组由若干逗号分隔的值组成,例如:

  1. t = 12345, 54321, 'hello!'
  2. print(t[0])
  3. print(t)
  4. u = t, (1, 2, 3, 4, 5)
  5. print(u)
  1. 12345
  2. (12345, 54321, 'hello!')
  3. ((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))

3、集合

集合是一个无序不重复元素的集。基本功能包括关系测试和消除重复元素。

可以用大括号({})创建集合。注意:如果要创建一个空集合,你必须用 set() 而不是 {} ;后者创建一个空的字典,下一节我们会介绍这个数据结构。

以下是一个简单的演示:

  1. basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
  2. print(basket)
  3. print('orange' in basket)
  4. print('crabgrass' in basket)
  5. a = set('abracadabra')
  6. b = set('alacazam')
  7. print(a)
  8. print(b)
  9. print(a - b) # 在a中存在但是在b中不存在
  10. print(a | b) # a与b的合集
  11. print(a & b) # a与b的并集
  12. print(a ^ b) # a|b - a&b
  13. # 集合也支持推导式
  14. c ={ x for x in 'abracadabra' if x not in 'abc'}
  15. print(c)
  1. {'pear', 'banana', 'apple', 'orange'}
  2. True
  3. False
  4. {'d', 'r', 'c', 'b', 'a'}
  5. {'m', 'z', 'l', 'c', 'a'}
  6. {'r', 'd', 'b'}
  7. {'m', 'l', 'r', 'z', 'c', 'd', 'b', 'a'}
  8. {'c', 'a'}
  9. {'m', 'l', 'z', 'r', 'd', 'b'}
  10. {'r', 'd'}

4、字典

另一个非常有用的 Python 内建数据类型是字典。

序列是以连续的整数为索引,与此不同的是,字典以关键字为索引,关键字可以是任意不可变类型,通常用字符串或数值。

理解字典的最佳方式是把它看做无序的键=>值对集合。在同一个字典之内,关键字必须是互不相同。

一对大括号创建一个空的字典:{}。

这是一个字典运用的简单例子:

  1. tel = {'jack': 4098, 'sape': 4139}
  2. tel['guido'] = 4127
  3. print(tel)
  4. print(tel['jack'])
  5. del tel['sape']
  6. tel['irv'] = 4127
  7. print(tel)
  8. print(list(tel.keys()))
  9. print(sorted(tel.keys()))
  10. print('guido' in tel)
  11. print('jack' not in tel)
  1. {'sape': 4139, 'guido': 4127, 'jack': 4098}
  2. 4098
  3. {'irv': 4127, 'guido': 4127, 'jack': 4098}
  4. ['irv', 'guido', 'jack']
  5. ['guido', 'irv', 'jack']
  6. True
  7. False
  1. # 构造函数 dict() 直接从键值对元组列表中构建字典。如果有固定的模式,列表推导式指定特定的键值对:
  2. a = dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
  3. print(a)
  4. # 此外,字典推导可以用来创建任意键和值的表达式词典:
  5. b = {x: x**2 for x in (2, 4, 6)}
  6. print(b)
  7. # 如果关键字只是简单的字符串,使用关键字参数指定键值对有时候更方便:
  8. c = dict(sape=4139, guido=4127, jack=4098)
  9. print(c)
  1. {'sape': 4139, 'guido': 4127, 'jack': 4098}
  2. {2: 4, 4: 16, 6: 36}
  3. {'sape': 4139, 'guido': 4127, 'jack': 4098}

5、遍历技巧

在字典中遍历时,关键字和对应的值可以使用 items() 方法同时解读出来:

  1. knights = {'gallahad': 'the pure', 'robin': 'the brave'}
  2. for k, v in knights.items():
  3. print(k, v)
  1. gallahad the pure
  2. robin the brave
  1. # 在序列中遍历时,索引位置和对应值可以使用 enumerate() 函数同时得到:
  2. for i, v in enumerate(['tic', 'tac', 'toe']):
  3. print(i, v)
  4. # 同时遍历两个或更多的序列,可以使用 zip() 组合
  5. questions = ['name', 'quest', 'favorite color']
  6. answers = ['lancelot', 'the holy grail', 'blue']
  7. for q, a in zip(questions, answers):
  8. print('What is your {0}? It is {1}.'.format(q, a))
  9. # 要按顺序遍历一个序列,使用 sorted() 函数返回一个已排序的序列,并不修改原值:
  10. basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
  11. print(sorted(basket))
  12. for f in sorted(set(basket)):
  13. print(f)
  1. 0 tic
  2. 1 tac
  3. 2 toe
  4. What is your name? It is lancelot.
  5. What is your quest? It is the holy grail.
  6. What is your favorite color? It is blue.
  7. ['apple', 'apple', 'banana', 'orange', 'orange', 'pear']
  8. apple
  9. banana
  10. orange
  11. pear


END


2019-5-27 17:24:06

PYTHON 100days学习笔记008-1:数据结构补充的更多相关文章

  1. PYTHON 100days学习笔记007-1:python数据类型补充(1)

    目录 day007:python数据类型补充(1) 1.数字Number 1.1 Python 数字类型转换 1.2 Python 数字运算 1.3 数学函数 1.4 随机数函数 1.5 三角函数 1 ...

  2. PYTHON 100days学习笔记007-2:python数据类型补充(2)

    目录 day007:python数据类型补充(2) 1.Python3 元组 1.1 访问元组 1.2 删除元组 1.3 元组运算符 1.4 元组索引,截取 1.5 元组内置函数 2.python3 ...

  3. PYTHON 100days学习笔记007-3:字符串和常用数据结构

    目录 Day007:字符串和常用数据结构 1.使用字符串 2.使用列表 3.使用元组 4.使用字典 4.练习 4.1:在屏幕上显示跑马灯文字 4.2 设计一个函数产生指定长度的验证码,验证码由大小写字 ...

  4. PYTHON 100days学习笔记001:初识python

    现在学习这个确实时间很紧,但是迟早得学,以后PYTHON自动化运维,PYTHON自动测试都需要用的到,甚至可以往数据分析方向发展,刚好最近有数据观组织的python100天计划,就参加了,做好笔记,一 ...

  5. PYTHON 100days学习笔记008-4:错误和异常

    目录 Day008_04:python错误和异常 1.语法错误 2.异常 3.异常处理 4.抛出异常 5.用户自定义异常 6.定义清理行为 7.预定义的清理行为 参考文章: python3错误和异常 ...

  6. PYTHON 100days学习笔记008-3:输入和输出

    目录 Day008-03:Python3 输入和输出 1.输出格式美化 1.1 str.format()用法 1.2 旧式字符串格式化 2.读取键盘输入 3.读和写文件 4.文件对象的方法 4.1 f ...

  7. 【数据结构与算法Python版学习笔记】基本数据结构——列表 List,链表实现

    无序表链表 定义 一种数据项按照相对位置存放的数据集 抽象数据类型无序列表 UnorderedList 方法 list() 创建一个新的空列表.它不需要参数,而返回一个空列表. add(item) 将 ...

  8. PYTHON 100days学习笔记008-2:模块

    目录 Day008_02:模块 1.import语句 1.1from - import 语句 1.2 from - import * 语句 2.深入模块 2.1 __name__属性 2.2 dir( ...

  9. PYTHON 100days学习笔记006:函数和模块的使用

    目录 Day006:函数和模块的使用 1.函数的作用 2.定义函数 2.1 语法 2.2 实例 2.3 函数的调用 4.函数的参数 4.1 必须参数 4.2 关键字参数 4.3 默认参数 4.4 不定 ...

随机推荐

  1. 【Wince-禁止重复启动程序】Wince 不重复启动程序

    创建类Mutex.cs: using System; using System.Linq; using System.Collections.Generic; using System.Text; u ...

  2. Linux之GDB调试命令

    gdb启动 gdb 程序名 l 查看源代码(默认显示十行) l 文件名:行数 l 文件名:函数名 添加断点 break + 行数 (b 也行) b 15 if i == 15 条件断点 i b 查看断 ...

  3. JS的数据储存格式

    javaScript有三种数据存储方式,分别是:sessionStoragelocalStoragecookier 相同点:都保存在浏览器端,同源的 不同点:①传递方式不同cookie数据始终在同源的 ...

  4. Netfilter 之 钩子函数与钩子点关系图

    概述 通过钩子点和优先级的代码追溯,得到如下对应关系图,图中横坐标为钩子点,纵坐标为优先级,每个钩子点上的钩子函数按照优先级排布: 详细分析 5个钩子点如下所示,在这个五个钩子点上的钩子函数按照上面的 ...

  5. 树形dp(灯与街道)

    https://cn.vjudge.net/contest/260665#problem/E 题意: 给你一个n个点m条边的无向无环图,在尽量少的节点上放灯,使得所有边都被照亮.每盏灯将照亮以它为一个 ...

  6. caps lock 映射成 esc,右Ctrl映射右移

    xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape' xmodmap -e 'clear Lock' -e 'keycode 105= Right'

  7. 使用Jsp +Js + Jquery + EasyUI + Servlet + Lucene,完成分页

    步一:创建ArticleDao.java类 public class ArticleDao { public Integer getAllObjectNum(String keywords) thro ...

  8. ValueAnimator

    import android.animation.ValueAnimator; import android.os.Bundle; import android.support.v7.app.AppC ...

  9. ansible简单入门

    1,结构框架 Ansible 使用的是无代理体系结构,这种体系结构可以通过防止节点轮询控制机器来减少网络开销.Ansible 提供的结果框架如下所示: Ansible :运行在中央计算机上: Conn ...

  10. Python3+RobotFramewok 快速入门(二)

    1. 原理 首先解释一下RF的工作原理,官方文档介绍就不赘述了,笔者就框架架构做出一个更加具体的描述 测试套及测试用例集(Test Data即需要用户编写的脚本)通过RF特定的语法解析,然后知道用户要 ...