列表转化成数组_Python编程必备——列表实现

列表(可索引的对象,索引是最快的)的操作,最多应用的是append(增,会涉及到开辟空间,可能会有GC的操作)和pop(删,什么都不写,弹出最后一个,或者写索引)

sort是对本身进行修改(就地修改),返回None

list.sort数字和字符串可以混合排序:

ce03f415c3e1c6cffaa9ff59f853dab8.png
key指代的是按照key类型转换,进行比较

类似于:

e26dc62f78962d9ebe517dd9f8af652c.png

只要是可迭代对象都可以用sorted(指向修改),内部进行了copy ,操作副本,返回副本(原有list.copy)。

sorted(itrearble, cmp=None, key=None, reverse=False),返回list(新的!)

f86e78d238f7f609d02da5b55fe15ef9.png
立即返回一个新的列表

=号后面是默认值 默认是升序排序的, 如果想让结果降序排列,用reverse=True。最后会将排序的结果放到一个新的列表中, 而不是对iterable本身进行修改。

sorted 和list.sort 都接受key, reverse定制。但是区别是。list.sort()是列表中的方法,只能用于列表。而sorted可以用于任何可迭代的对象。list.sort()是在原序列上进行修改,不会产生新的序列。所以如果你不需要旧的序列,可以选择list.sort()。 sorted() 会返回一个新的序列。旧的对象依然存在。

如果你有一个字典,键是正负都有的只有一个小数点的数字字符串, 你想按数字从小到大排列键,首先把键列表转化为浮点型。对浮点型数据用sorted排序,然后再转化为只有一个小数点的数字字符串:

for i in ['%.1f'%k for k in sorted(float(j) for j in fb_RA_11.keys())]:

对列表序列使用+和*

如果你熟悉字符串拼接的话,*,+一定经常使用,对于列表也是可以使用+和*的,对一个对象复制几份在拼接起来。一次性开辟,采用*乘法扩展list效率更高,append方式一次次加效率比较低。(列表索引操作效率较好)

a7f7876597d76d3b65505d14a3db7f28.png

错误示范:

如果你想使用mylist = [ [] ] * 3 初始化,得到的一个包含三个列表的列表对象,就像这样mylist [[], [], []],中确实包含三个对象,但是其实你的列表中的三个元素都是对同一个列表对象的引用,并且都指向同一个列表

655c88b8ca42b3cbcfbe03c0b1ef5c4a.png

正解:

3584994f68e7f1a1fc53b72dac04aa60.png

切片:

9cc166a9115460d5949d53363c0735a2.png

以0为下标开始这样做的好处是:

  1. 当只有最后一个位置信息时,我们也可以快速看出切片和区间里有几个元素:range(3) 和 my_list[:3] 都返回 3 个元素。
  2. 当起止位置信息都可见时,我们可以快速计算出切片和区间的长度,用后一个数减去第一个下标(stop - start)即可。
  3. 这样做也让我们可以利用任意一个下标来把序列分割成不重叠的两部分,只要写成 my_list[:x] 和 my_list[x:] 就可以了

给切片赋值:可迭代对象的重要

4a2c7589072d563ab24fb2ab4b52902e.png
数组l切片是一个可迭代对象,而100却不是,当我们把100转化成[100]这个可迭代序列

81d7bbfc98cf4ac6f84dc4549f969d53.png
(左闭右开)

enumerate:列表(有序)--> 配对

40f1e9910216ff2cfb0222e1883b602d.png
注意:它配对的是迭代对象,返回的也是迭代对象

2d6c145057a53dc826450ca2addc7dca.png

9e3dc089f18b451f44ae4d4cb9521f91.png
返回一个对象,不会立即返回你要的东西,只有你要用的时候才返回

95271b5c8ba58e9143ff39ad29f771da.png
list迭代enumerate,enumerate迭代range,将数值和索引进行配对,可以更改起始索引

cb3f0c13765e96d353272761888a1b90.png
enumerate返回结果为一个可迭代对象,第二个图中的list是多此一举

杨辉三角:

ba3a296331251dacec0f14afc1480425.png

6fb3b904874729a632ca81e43a9fbebd.png
该方式没有记录数据,每求一个值都需要计算一遍,应用列表存储如下:

76f6dcf883df5e800466f5f04f0352d3.png

06070ec8a829f7042d42cbcd23320b34.png

e4d58e377ab623a7730e1e64386e92e1.png

620b702eed1fb1463ba6335e8d7804b2.png
开头1,末尾自动追加1,计算的元素个数是前一行的长度减一(记录所有数据,append追加开辟空间)

7259aa49f782dc5915183c72b7ae242d.png

748a037e27386382a35a072df60d589d.png

8ee447c3f0dbf9b88f2f499b5a986763.png
发现newline的id没变,只是在不断地追加,清除,但是oldline在不断地追加,重新开辟空间

9f7c0461741d466b47e14820db4edcda.png

4646d023208ea028c8fa9dee47c0f882.png
对称性 --> 折半的上限定义

9efca90c314d3ae1aa4656467e27e601.png

9a9cc3efe28a5696a675b07e1e436342.png
开辟空间方式不同,更优于上一种

037b5001048792374cb329cd0352e5d5.png
用*方式一次性开辟该行所需要的空间,填1,所以前两行无需修改,条件直接判断是否是第三行,再进入

8e63e0aa3d17f7d33be9f78578856a26.png

没有说保留数据,只要求打印,所以可以覆盖来节省空间:

a922c470bcd2f28a1928179747cb4a6d.png

0bbf959f3b1df7e0ee111c004b38e155.png
切片打印

dad3e022da3199b3b00cf297aa256d53.png
第6行6个元素,是最长的列表

2944a014ffe9ddeac1fc3e51b4cab8ae.png
offset的一个推导,字略丑

转置矩阵:

a431f39e1b88fab202d68ed3f08ec66a.png
数据分析可能会偏向于矩阵,二维较合适

0d6b9f0cd2d860face7cf24cff4a662a.png
正方阵

d4ffcc834ed137b7ea21eba09ab7e6c6.png
矩阵拷贝必须深度拷贝,否则拷贝的是地址,不是数值!但是否应重新开启内存呢?

9e4d4cf0bb6169faeb07251b795fc1ee.png

5e4390f1bbc562d1cbb7e3ff97541168.png
count为交换次数,方便优化才加入的变量

ca56091cf5470c4f44f35e479f10500c.png

9fb9d0c2ed3ac4e8c8091320eb441b32.png

ecb0d883c358257484ca83cb6bdb2fce.png

12b1d1c4e59ad754ebee459c7ab7405c.png
扭转拷贝。其实上图有点不理解row,col的对应关系,有理解的可以交流一下~

fd47dc216156f4b59bbcec77b7806478.png

06dd2e561d2132f9db69e1dc5818a8b8.png
在ipython中可以使用%%timeit测试

9bff3c2da297084b3e59b19d27bd2725.png

d8da91e2ad7f6f9c2f8945e66500da1d.png

eafc8e5420eec56c8647435b2abfddf6.png
zip将数值与状态列表结合转成list打印,方便观看状态;若要统计重复几次,用字典会更加方便
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值