python (第二章)数据结构

文章目录

    • 2.5 对序列使用 +和 ×
      • 建立由列表组成的列表
    • 2.6序列的增量赋值(+=和×=)
      • 关于 +=的谜题
        • 补充:extend()方法和+有什么区别呢?
    • 2.7 list.sort方法和内置函数sorted(排序)
    • 2.8 用bisect来管理已排序的序列
      • 2.8.2用bisect.insort插入元素
    • 2.9 当列表不是首选时
      • 2.9.1 数组
      • 2.9.2内存视图
      • 2.9.3 NumPy和SciPy
      • 2.9.4 双向队列和其他的形式的队列

2.5 对序列使用 +和 ×

l = [1,2,3]
print(id(l))
t= l*5
print(id(t))

结果如图:

在这里插入图片描述

  • 总结:+ 和 * 都遵循这个规律,不修改原有的操作对象,而是构建一个全新的序列。
  • 注意:如果a*n 这个语句中,序列a里面的元素是对其他可变对象的引用的话,这个结果可能会出乎意料。比如,你想用my_list = [[]]*3 来初始化一个由列表组成的列表,但是你得到的列表里面包含的3个元素其实是3个引用,而且这3个引用指向同一个列表。这显然不是想要的。

建立由列表组成的列表

正确的方式1:

board = [['_'] * 3 for i in range(3)]
print(board)
board[1][2] = 'X'
print(board)

结果如图:
在这里插入图片描述

错误的方式1:含有3个指向同一对象的引用的列表是毫无用处的。

weird_board = [['_']*3] *3
print(weird_board)
weird_board[1][2] = '0'
print(weird_board)

结果如图:
在这里插入图片描述

错误的方式2:
这个和上一个错误的本质是一样的

row = [' _ ']*3
board = []
for i in range(3):board.append(row)
print(board)
board[1][2] ='0'
print(board)

结果如图:
在这里插入图片描述
正确的方式2:
这里的等同于正确的方式1

board = []
for i in range(3):row = ['_']*3 # 每次迭代中都新建了一个列表,作为新的一行添加到boardboard.append(row)
print(board)
board[1][2] ='0'
print(board)

结果如图:
在这里插入图片描述

2.6序列的增量赋值(+=和×=)

增量赋值运算符+=和*=的表现取决于它们的第一个操作对象,本次的就集中讨论(+=)。对其他的增量运算符也同样适用。
+=背后的特殊方法是__iadd__(用于‘就地加法’),所谓的‘就地’理解为:不创建新的对象,而是将原来的对象重新赋值。如果一个类没有实现这个方法的话,python会退一步调用__add__.
我们考虑下面这个简单的表达式:

  • a+=b

  • 讨论:
    (1).若a实现了__iadd__方法,就会调用这个方法。同时对于可变序列(list,bytearray和array.array)来说,a会就地变动了,就像调用了a.extend(b)一样
    (2).若a没有实现__iadd__方法,a+=b这个表达式的效果就会根a=a+b一样了;首先计算a+b,得到一个新的对象,然后赋值给a。

  • 总结:
    在这个表达式中,变量名会不会被关联到新的可变对象,完全取决于这个类型有没有实现__iadd__这个方法。总的来说,可变序列一般都实现了__iadd__这个方法,因此+=是就地加法。而不可变序列没有实现这个方法,就会像步骤(2)那样操作。后者相对应的是__imul__.

例子:

l = [1, 2, 3]
print('before id(l):',id(l))
l *=2
print(l)
print('after id(l):',id(l))
t = (1, 2, 3)
print('before id(t):',id(t))
t *= 2
print('after id(t):',id(t)) # 运用增量惩罚后,新的元组被创建

结果如图:
在这里插入图片描述

关于 +=的谜题

t = (1, 2, [30,40])
t[2] += [50, 60]
print(t)

在这里插入图片描述
结果:t[2]被改动了,但是也有异常出现。但是我们可以写成t[2].extend([50,60])来避免这个异常。

教训:

  • 不要把可变对象放在元组里面
  • 增量赋值不是一个原子操。它虽然会抛出异常,但是还是完成了操作
  • 查看python的字节码并不难,它对我们了解代码背后的运行机制很有帮助。

补充:extend()方法和+有什么区别呢?

a = [1,2,3]
b = [4,5,6]
c = a+bd = [1,2,3]
e = [4,5,6]
d.extend(e)

结果如图:
在这里插入图片描述
结论:
结果是一样的,但是+号生成的是一个新的对象,而extend则是在原地的修改对象。
extend()的运算效率比+更高。但是, d.extend(e) 的返回结果是None,而不是合并后的序列。d序列是合并后的序列。
c返回的是新的序列。

2.7 list.sort方法和内置函数sorted(排序)

list.sort方法会就地排序列表,这也是这个方法返回None的原因,按照python的惯例:如果一个函数或者方法对对象进行的是就地改动,那它就应该返回None.
与list.sort相反的是sorted,它会新建一个列表作为返回值。这个方法可以接受人和形式的可迭代对象作为参数,甚至包括不可变序列或者生成器,但是它总是返回一个列表。
不管list.sort或者sorted函数,都有两个参数,reverse和key

  • reverse:默认为False,就是升序排列,True为降序排列
  • key:对一些字符串进行排序的时候,key=str.lower来实现忽略大小写的排序;key=len来显示根据字符串长度来排序。

例子:

fruits = ['grape', 'raspberry', 'apple', 'banana']
print("未排序:", fruits)
print(sorted(fruits))
print("sorted:", fruits)
print(sorted(fruits,reverse=True))
print(sorted(fruits,key=len))
print(sorted(fruits,key=len,reverse=True))
print(fruits)
fruits.sort()
print(fruits)

结果如下:
在这里插入图片描述
可以发现,直到执行了fruits.sort方法,fruits本身才发生了变化。
排好序的序列可以用来进行快速搜索,而标准库的bisect模块给我们提供了二分查找算法。

2.8 用bisect来管理已排序的序列

bisect模块包含类 两个主要函数,bisect和insert,两个函数都利用二分查找算法在有序序列中查找或者插入元素。
在有序序列中用bisect查找某个元素的插入位置。
例子1:

import bisect
import sys
HAYSTACK = [1, 4, 5, 6, 8, 12, 15, 20, 21, 23, 23, 26, 29, 30]
NEEDLES = [0, 1, 2, 5, 8, 10, 22, 23, 29, 30, 31]
ROW_FMT = '{0:2d} @ {1:2d}   {2}{0:2d}'
def demo(bisect_fn):for needle in reversed(NEEDLES):position = bisect_fn(HAYSTACK, needle) #返回插入的位置offset = position * '  |'print(ROW_FMT.format(needle, position, offset))# return bisect_fnif __name__ == '__main__':if sys.argv[-1] == 'left':bisect_fn = bisect.bisect_left  #当碰到相等的元素的时候,会放在它左边(前边) else:bisect_fn = bisect.bisect #或者是bisect_fn = bisect.bisect_right,当碰到相等的元素的时候,会放在它的右边(后边)print('DEMO:', bisect_fn.__name__)print('haystack ->', ' '.join('%2d' % n for n in HAYSTACK))demo(bisect_fn)

例子2:根据分数找到它对应的成绩

import bisect
def grade(score,breakpoint = [60,70,80,90],grades='FDCBA'):i = bisect.bisect(breakpoint,score) # 返回i,匹配gradesreturn grades[i]
t = [grade(score) for score in [33,99,77,70,89,91,10]]
print(t)

输出:

['F', 'A', 'C', 'C', 'B', 'A', 'F']

2.8.2用bisect.insort插入元素

insort(seq,item) 把变量item插入到序列seq中,并能保持seq的升序顺序。

import bisect
import random
SIZE = 7
random.seed(1729)
my_list = []
for i in range(SIZE):new_item = random.randrange(SIZE*2)bisect.insort(my_list, new_item)print('%2d ->' % new_item, my_list)

结果如图:
在这里插入图片描述

  • 补充: %和format的区别

参考:https://www.cnblogs.com/zhaopanpan/p/8875765.html (%和format的区别)

2.9 当列表不是首选时

2.9.1 数组

2.9.2内存视图

2.9.3 NumPy和SciPy

科学计算有关的算法

窥探NumPy二维数组的基本操作

import numpy
a = numpy.arange(12)
print(a)
print(type(a))
print(a.shape)#查看维度
a.shape = 3, 4 #变成二维的
print(a)
print(a[2])
print(a[2, 1])
print(a[:, 1])
t = a.transpose() #行列交换,得到**新的数组**
print(t) 

结果如下:
在这里插入图片描述
可以发现t是一个新的数组。

2.9.4 双向队列和其他的形式的队列

补充:markdown生成目录方式,在开头输出[toc]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273849.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库 CURD测试题【简单】

文章目录1.组合两个表基本信息要求答案2.第二高的薪水基本信息要求答案3.查找重复的电子邮箱基本信息要求答案4.超过经理收入的员工基本信息要求答案:5.超过5名学生的课信息:要求答案6.有趣的电影信息要求答案7.交换工资(updeta,条件判断&…

JAVA学习资料整理

今天偶然间发现之前一个群里发过的一篇关于JAVA学习资料的东西。本着服务大众的精神,搬来了博客园: 《JAVA编程思想》第四版(英文原版)下载地址:http://115.com/file/e7fzi0fm《JAVA开发实战经典》下载地址&#xff1a…

mysql快速了解

文章目录数据库了解:快速操作:安装mysql启动,关闭,重启mysql服务连接mysql的root用户创建数据库删除数据库选择数据库mysql 数据类型MySQL 创建数据表MySQL 删除数据表MySQL 插入数据MySQL 查询数据MySQL WHERE 子句BINARY 关键字MySQL UPDATE 更新批量更…

javascript编程风格(粗略笔记)

1、空格 紧凑型&#xff1a;    project.MyClass function(arg1, arg2){  松散型&#xff1a;    for( i 0; i < length; i ){ 2、代码行长度  最多80个字符 3、命名: 采用驼峰式方法命名(开始的第一个单词小写&#xff0c;之后的所有单词首字母大写)  var …

数据结构 面试题

文章目录1.数组1.1 寻找数组中第二小的元素1.2 找到数组中第一个不重复出现的整数1.3合并两个有序数组1.4 重新排列数组中的正值和负值2.栈2.1 前缀表达式&#xff0c;中缀表达式&#xff0c;后缀表达式2.1.1 中缀表达式转化为后缀表达式2.1.2 中缀表达式转化为前缀表达式2.2使…

WPF之无法触发KeyDown或者KeyUp键盘事件

有时候我们可能在Panel(StackPanel、Canvas、Grid)上或者是在一些默认不支持Focus的控件上添加了KeyDown或者KeyUp&#xff0c;可是残酷的现实告诉我们&#xff0c;这是无法触发的&#xff0c;怎么办呢&#xff0c;很简单&#xff0c;只需一句代码。 private void MouseLeftBut…

宣布在日本地区正式发布 Windows Azure

&#xfeff;&#xfeff;昨天&#xff0c;我与 Microsoft 日本的集团副总裁 Yasuyuki Higuchi 一同站在台上&#xff0c;宣布在两个新地区正式发布 Windows Azure&#xff1a;日本东部和日本西部。能够亲自见证 Microsoft 对日本市场的持续承诺&#xff0c;对我来说是莫大的荣…

运行cmd状态下MySQL导入导出.sql文件

MySQL导入导出.sql文件步骤如下&#xff1a; 一.MySQL的命令行模式的设置&#xff1a; 桌面->我的电脑->属性->环境变量->新建-> PATH“&#xff1b;path\mysql\bin;”其中path为MySQL的安装路径。 二.简单的介绍一下命令行进入MySQL的方法&#xff1a; 1.C:\&g…

python中的collections

文章目录deque(双向列表)defaultdict(为不存在的key设置默认值)OrderedDictOrderedDict可以实现一个FIFO&#xff08;先进先出&#xff09;的dict&#xff0c;Counter参考collections是Python内建的一个集合模块&#xff0c;提供了许多有用的集合类。deque(双向列表) 使用list…

mysql 面试点

文章目录mysql 运算符1.mysql运算符中的 !和Not的区别&#xff1f;CRUD1.条件判断的用法2. not exits 和not in 的区别3. case when语句mysql函数1.to_days()连接1.什么时候选择右连接&#xff0c;什么时候选择左连接&#xff1f;mysql 运算符 1.mysql运算符中的 !和Not的区别…

[Windows Phone] 实作不同的地图显示模式

[Windows Phone] 实作不同的地图显示模式 原文:[Windows Phone] 实作不同的地图显示模式前言 本文章主要示范如何让地图有不同的模式产生&#xff0c;例如平面图、地形图、鸟瞰图、鸟瞰图含街道等。 这部分主要是调整 Map.CartographicMode 属性&#xff0c;其中 MapCartograph…

数据库 CURD测试题【中等】

文章目录1.换座位&#xff08;交换相邻的id&#xff09;基本信息要求答案[case when]2.分数排名(分组&#xff0c;排序)基本信息要求答案3.连续出现的数字(连接)信息要求答案4.第N高的薪水(函数)信息要求答案5.各个部门工资最高的员工(分组&#xff0c;连接)信息要求答案6.统计…

[STemWin教程入门篇]第一期:emWin介绍

特别说明&#xff1a;原创教程&#xff0c;未经许可禁止转载&#xff0c;教程采用回复可见的形式&#xff0c;谢谢大家的支持。 armfly-x2,x3,v2,v3,v5开发板裸机和带系统的emWin工程已经全部建立&#xff0c;链接如下&#xff1a; http://bbs.armfly.com/read.php?tid1830 SE…

python 栈【测试题】

文章目录1.删除最外层的括号信息要求答案2.棒球比赛信息示例答案3. 用栈实现队列要求说明:答案4.用队列模拟栈描述注意答案5.下一个更大的元素&#xff08;未解&#xff09;信息&#xff1a;示例&#xff1a;注意:答案&#xff1a;6.删除字符串中的所有相邻重复项信息示例&…

python从socket做个websocket的聊天室server

下面的是server端&#xff1a;把IP改成自己的局域网IP&#xff1a; #coding:utf8 import socket,select import SocketServer import hashlib,base64,time from pprint import pprint#author:lijim def f(key):skey"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"sha1hashli…

python进阶(第三章1) 字典

文章目录3.1 泛映射类型什么是可散列的数据类型&#xff08;键的要求&#xff09;字典的构造方法3.2 字典推导(dictcomp)3.3 常见的映射方法用setdefault处理找不到的键3.4 映射的弹性键查询3.4.1 defaultdict:处理找不到的键的一个选择注意&#xff1a;defaultdict与dict实例化…

python基础 list和tuple

文章目录一、list1、len()函数可以获得list元素的个数2、索引从0开始3、末尾追加 append(xx)4、也可以把元素插入到指定的位置&#xff0c;比如索引号为1的位置(insert)5、末尾删除pop() &#xff0c;并且返回该值6、要删除指定位置的元素&#xff0c;用pop(i)方法&#xff0c;…

HDU 2818 Building Block

题目连接 http://acm.hdu.edu.cn/showproblem.php?pid2818 题意:给定N个blocks&#xff0c;分在N个堆里&#xff0c;然后又P个操作&#xff0c;每次将x所在的堆放在y所在的堆上&#xff0c;或者询问x的下面有几个blocks 做法&#xff1a;带权并查集 因为要查询x的下面有多少bl…

百度社会化分享组件使用问题

今天下午玩了玩百度的社会化分享sdk,我是在这下载的sdk http://developer.baidu.com/frontia/sdk 谁知道这个下载链接是没更新的,还是1.0版本的,是尼玛13年初的版本 捣鼓了半天各种bug 然后去百度官网重新找http://developer.baidu.com/wiki/index.php?titledocs/frontia/res…