首页 > 编程语言 >[python笔记]举证二维列表,深浅拷贝,is,in,列表推导式及关于上次博的补充(补)

[python笔记]举证二维列表,深浅拷贝,is,in,列表推导式及关于上次博的补充(补)

时间:2022-10-30 14:00:27浏览次数:46  
标签:10 target python 列表 range 举证 拷贝 copy

〇引言

对上篇博客知识的补充,也是个人笔记。现在离开手机简直不能活了,所以把笔记记录在博客上挺方便的。当然这个是纯笔记,没啥观赏性,还请见谅。

x=[[1,2,3],[4,5,6],[7,8,9]]
for i in x: #两个for语句
for each in i:
print(each)


1
2 #不算美观
3
4
5
6
7
8
9
for i in x:
for each in i:
print(each,end=' ') #end=' ' 以空格结尾


1 2 3 4 5 6 7 8 9

二维列表的下标索引

二维列表顾名思义,有行有列。在对python二维列表的直观认识应该是

x=[[1,2,3],                           #这样的
[4,5,6],
[7,8,9]]
x[0]
[1, 2, 3]

x[0][0]
1

即在x[ ]此处为行(每个小列表),x[][  ]此处为行里的哪一列(每个小列表里再拆分)

注意:python对于不同数据类型的储存机制。python对于不同对象的储存机制不一样。如下

b=[[0]*3]*3
a=[0,0,0]
for i in range(3):
a[i]=[0]*3

a
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
b
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
a is b
False

tips:同一性运算符 is 用于检验两个变量,是否指向同一个对象的运算符

由此可以看出a不等于b,来看一下他们的储存方式。

[python笔记]举证二维列表,深浅拷贝,is,in,列表推导式及关于上次博的补充(补)_浅拷贝

a指向三不同的[0,0,0],各自独立​,而b是对同一个[0,0,0]的三个引用。就是说会出现下面的这种情况

#仍是上面的a,b
a[0][1]=3
b[0][1]=3
a
[[0, 3, 0], [0, 0, 0], [0, 0, 0]]
b
[[0, 3, 0], [0, 3, 0], [0, 3, 0]]

拷贝

提到引用就不得不说拷贝

浅拷贝:在不调用copy模块的情况下进行的copy

x=[1,2,3]
y=x
x[0]=4
x
[4, 2, 3]
y
[4, 2, 3] #注意,将x赋值给y时,改变x里的一个数据,y也会跟着改变

这就应证了我在第一篇博里写到"变量不是一个盒子。"

那么就有引用这一说法

引用:当赋值运算发生时,python不是将数据放到变量里,而是将一个变量的引用传递给另一个变量(将一个变量赋值给一个变量)

如果需要两个独立的列表要用copy函数(此处的copy为浅拷贝

x=[1,2,3]
y=x.copy()
x[1]=9
y
[1, 2, 3]
x
[1, 9, 3]

我们也可以用切片的方法来实现

x=[4,5,6]
y=x[:]
x[0]=1
y
[4, 5, 6]
x
[1, 5, 6]

这是浅拷贝(只拷贝其表面),仅对一维列表有效。

#示例
x=[[1,2,3], #创建二维列表
[4,5,6],
[7,8,9]]
y=x.copy()
y
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
x[0][1]=9
y
[[1, 9, 3], [4, 5, 6], [7, 8, 9]] #x变,y也变
x
[[1, 9, 3], [4, 5, 6], [7, 8, 9]]

不论是y=x.copy(),y=x[:]  都是浅拷贝,只拷贝外层,内部是引用

[python笔记]举证二维列表,深浅拷贝,is,in,列表推导式及关于上次博的补充(补)_浅拷贝_02

固我们需要调用copy模块(但注意y=copy.copy(x)这个是浅拷贝)

要真正调用深拷贝要用copy模块里的deepcopy函数

x=[[1,2,3],                           #二维列表
[4,5,6],
[7,8,9]]
import copy
y=copy.deepcopy(x)
x[0][1]=100
x
[[1, 100, 3], [4, 5, 6], [7, 8, 9]]
y
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

列表推导式

语法:[expression for target in iterable]

#实例
x=[i for i in range(10)]
x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

这个语句的执行顺序是

执行在for语句中的range(10),把数据存放在for语句后的i,后放入列表表达式的i中。

也就是说,他的执行顺序是从后往前的。并且在列表表达式中再执行一次,及可在其中再执行相关语句

x=[i+1 for i in range(10)]
x
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
#我们也可以用老方法现实
x=[]
for i in range(10):
x.append(i+1)
#由此可以看出列表推导式执行的便捷性

其他用法

y=[c*2 for c in 'love']            #在字符串上应用
y
['ll', 'oo', 'vv', 'ee']
#用ord()将字符转化为Unicode编码
code=[ord(c) for c in 'love']
code
[108, 111, 118, 101]

用列表推导式将矩阵第二列提取

x=[[1,2,3],                           #直观看一下二维列表
[4,5,6],
[7,8,9]]
#用英文名命名col=column列   row行
col2=[row[1] for row in x]
col2
[2, 5, 8]

内核就是把x二维列表的每一行的第二个数抽取组成新的列表

diag = [x[i][i] for i in range(len(x))]            #提取斜对角线
diag
[1, 5, 9]

for i in range(len(x))  首先len()获取列表x的长度,然后fanhuix[i][i],及[0][0],[1][1],[2][2]

diag = [x[-i][-i] for i in range(len(x))]
diag
[1, 9, 5]
#下标为负
diag = [x[i][2-i] for i in range(len(x))]
diag
[3, 5, 7]
#另一个对角线

用列表推导式建立矩阵

s=[[0]*3 for i in range(3)]
s
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
s[0][1]=100
s
[[0, 100, 0], [0, 0, 0], [0, 0, 0]] #注意这里三个小列表相互独立

可以在列表推导式加上条件语句

[expression for target in iterable if condition]

执行顺序是先for语句,然后if语句,最后for前的语句。例如

x=[i for i in range(10) if i%2==0]
x
[0, 2, 4, 6, 8]
#可以起到筛选的作用
word=['fan','coco','frank','female','apple','pear','fall']
f_word=[w for w in word if w[0]=='f']
f_word
['fan', 'frank', 'female', 'fall']

嵌套列表

#语法如下
[expression for target in iterable1
for target in iterable2
......
for target in iterableN]

可以拆分列表(注意顺序)

matrix=[[1,2,3],                           
[4,5,6],
[7,8,9]]
flatten=[col for row in matrix for col in row]
flatten
[1, 2, 3, 4, 5, 6, 7, 8, 9]

用老方法写

flatten=[]
for row in matrix:
for col in row:
flatten.append(col)

应用在字符串上

s=[x+y for x in 'love' for y in 'you']
s
['ly', 'lo', 'lu', 'oy', 'oo', 'ou', 'vy', 'vo', 'vu', 'ey', 'eo', 'eu']
for x in 'love':
for y in 'you':
s.append(x+y)
#这才是完整的语法
#语法如下
[expression for target in iterable1 if condition1
for target in iterable2 if condition2
......
for target in iterableN if conditionN]
#示例代码
s=[[x,y] for x in range(10) if x%2==0 for y in range(10) if y%3==0]
s
[[0, 0], [0, 3], [0, 6], [0, 9], [2, 0], [2, 3], [2, 6], [2, 9], [4, 0], [4, 3], [4, 6], [4, 9], [6, 0], [6, 3], [6, 6], [6, 9], [8, 0], [8, 3], [8, 6], [8, 9]]
#老方法
s=[]
for x in range(10):
if x%2==0:
for y in range(10):
if y%3==0:
s.append([x,y])

但这些花哨高级,但难以理解,我们编程应该遵守KISS原则,及Keep It Simple and Stupid

感谢阅读

标签:10,target,python,列表,range,举证,拷贝,copy
From: https://blog.51cto.com/u_15818358/5807514

相关文章

  • 【设计模式】-python-创建型
    单例模式只允许一个类只有一个实例。先了解一下下python的init()方法和new()方法init不是实例化一个类第一个调用的方法,第一个调用的方法是new方法,new方法返回一个......
  • python基础-流程控制
    1.逻辑  逻辑判断:对于一件事情正确与否的判断,python中用布尔类型真(True)、假(False)做区分;  根据判断结果的不同去完成的不同操作,就是我们的业务逻辑;  对于条件是否......
  • php 读取 csv 转数组列表
    我们有个文档需要修改,但是文档列太多,以及数量太大,以至于眼睛看起来很吃力,于是我决定做个简单的转化用脚本读取我想要验证的列的内容是否正确.于是就产生了一个这样将csv......
  • Python 根据两个字段排序 中文排序 汉字排序 升序 降序
    Python3写法代码#-*-coding:utf-8-*-#需求:年龄倒序,姓名正序fromitertoolsimportchainfrompypinyinimportpinyin,StyleclassStudent:def__init__(self,na......
  • HCIA-ICT实战基础08-访问控制列表ACL原理与配置
    HCIA-ICT实战基础-访问控制列表ACL原理与配置目录ACL技术概述ACL的基本概念及其工作原理ACL的基础配置及应用ACL技术概述技术背景:需要一个工具实现流量过滤ACL是......
  • HCIA-ICT实战基础07-访问控制列表ACL进阶
    HCIA-ICT实战基础-访问控制列表ACL进阶目录二层ACL技术及配置高级ACL的扩展使用方法及使用场景1二层ACL技术及配置1.1二层ACL概念使用报文的以太网帧头来定义规则,......
  • python 内部类调用相关
     内部类classMyOuter:age=18def__init__(self,name):self.name=nameclassMyInner:def__init__(self,inner_name):......
  • 02markdown列表区块
    markdown列表1.markdown支持有序列表和无序列表无序列表使用*,+或-号作为列表标记,标记后面添加一个空格,然后填写内容第一项第二项第一项第二项有序列表使用数字......
  • KeyCode列表
     keycode8=BackSpaceBackSpacekeycode9=TabTabkeycode12=Clearkeycode13=Enterkeycode16=Shift_Lkeycode17=Control_Lkeycode18=Alt_Lkeycode19......
  • python精确计算浮点数
    因为二进制计算的问题,部分浮点数不能精确计算,如>>>1.1+2.23.30000000000003可以使用round(number,保留位数)或decimal包fromdecimalimportDecimala=Decima......