python字典和集合支持双向索引_手把手教你学python之六(字典续和集合)

7d6d957d8a34cabc0900c487f89ebaee33ef3854.jpg

在此先说一句抱歉,因为up开学了,一学期学五门控制,肯定是更新会慢。要么就是每次更新内容会变少,但是up一定会坚持更新,请不要放弃关注up哦,up一直致力于写出高质量的文章,以后up会以内容来写文章,也就是说和这一篇就只是讲完那几个知识点,不像以前想停就停,一个知识点可能跨了好几讲,还有每篇文章标题会写内容是什么,方便查看。但是由于现在b站没办法改发出去的稿子,有些补充上一讲的碎知识点就没办法了。还有up回到了学校,笔记本比较老,只能用python3.4,可能你们用的版本高有些地方会有改动,但是大体还是一样的。如果有和up讲的不一样的,可以help一下看看有什么不一样,08d1de80d06c4f8b0fbde775a7fc260852b3e23c.png

注意不要加最后的括号。另外help可以查看内置函数,比如说我查看字典的内置方法f93132b4c3bb98759130185bb37143d14c8ff80a.png

如果只想知道有哪些内置方法,不用知道具体方法,可以用dir5ff8e6efd75e7a1309c5562b0c05eb99e325896c.png

那么我们还要学bif干嘛?到时候只需要help一下不就行了?这样想你就错了,做任何事都会有一个deadine,时限,比如老板让你做一个项目,会无限期的给你时间吗?python内置方法有很多,要学会需要很长时间,但是如果你事先对它们有个印象,大概知道有哪些内置方法它们的用法,在工作时,就能在有限的时间内迅速上手,即使忘了具体细节,help一下也是可以的,如果事先都不知道list有哪些内置方法,一个一个看能不能实现你想要的功能,那是耗费大量时间的,所以学习一些常用的内置方法还是很有必要的,好了闲话不多说。

上一讲评论里有大佬提示了笔者如何用尾递归写斐波那契数列,我们来看一下c99a406bbcff49d5709b5c0c89ea7da0c841a0a7.png

结果是对的。以a(4)为例,计算过程

a(4,1,1)

a(3,1,2)

a(2,2,3)

3

和上一讲的普通递归对比7e60670800430730ba22a5aeb92574bc5c5e1706.png

今天接着上面继续学习字典的bif或者说bim(built-in method)

首先补充一点关于浅拷贝和深拷贝c95fac9d8feb090617843b2f0af71afef747244e.png

首先说明前面学过的类型,只有列表和字典可以用copy()这个bif,它是一种浅拷贝,因为我们查看它的id看到,是不一样的,这也就是说pytho另外开辟了一块地方来存b这个标签指向的内容,所以说当我们改变a的元素,b是不受影响的。而赋值是一种深拷贝,我们看到c和a的id是一样的,也就是说a和c这两个标签都指向同一个地方,所以改变a会改变c,上面的例子是列表,字典也是一样,但是注意区别519f8272380c3538b81952f8bf7791e77d58f4c0.png

这是把a这个标签从19940416撕下来,给了26897864。而上一个代码实例只是改变了a中的一个元素,没有改变a标签贴的id。我们来看一个有意思的情况3c167645ac016c6d15a81ab32f37d3e2da855265.png

虽然a只有一个元素,但是只要是对元素操作,a贴的id都不变。下面是pop和popitem,pop后面参数是key值,,还有一个可选参数d,如果key字典里没有,会返回d,如果没有设置d,会报错。popitem是返回some(某个)(key,value)是元组的形式。185adac82a665ee9b7a8476922c51698b5b6779f.png

下面是实例1ab6dce31dbeda25122a8f2646b387f6e4659644.png

63dd9da3509056f14057a42dc96a8769f45acc40.png

注意字典没有索引,没有顺序,括号里参数是key,d可以数字和字符串,还可以是列表元组268d120ab59249953bb61c599b99ba68eec22698.png

我们看到a和b弹出的和你输进去的顺序是不一样的,a弹出了第一个输的,b弹出了最后一个输的,归根到底,还是因为字典没有顺序,所以随机弹出一个some。下面是setdefault72aae2267aef70143a1870fbf6802959d17839c7.png

2a5fda54d70ea8925d553873dddaae58b4cd6725.png

我们看到如果传进去的第一个参数key在字典里没有,字典里会创建一个。如果第二个参数没有,对应的value是None,如果有第二个参数,value就是第二个参数。如果传进去的第一个参数字典里有,那么就会打印对应的value,这时候第二个参数有没有是不影响的,有也不会影响原来的value。

再介绍一个update091c423a27f765445593cb785bd821237faf710d.png

623455b968aead4dcc8e9f596a57cb7213a72e9a.png

看到update可以去替换一些key对应的value,如果这些key字典里没有,就加入,但是必须key和value同时加入,不能缺失。

最后总结几点字典注意事项;keys不能是列表和字典,因为它们是可以改变的不是hash的,可以时元组和字符串,因为它们不可以被改变。一个key不可以被多次赋值,会报错。如果你试图为字典里没有的key赋值,字典里会加入这个key和对应的value,但是如果你访问字典里没有的key会报错,下面就是例子ee5609a4e247e3eae0ab27fbf418f8231680f58a.png

关于哈希ca54485ffb6075239ad5685ec529b1d49b80e368.png

8c0b9a21acf1177088111d4c963c037485f6b5c3.png

da2a039ff01e937dfd35cc91294214996bd4dd10.png

以上内容摘自http://bbs.fishc.com/forum.php?mod=viewthread&tid=45016&extra=page%3D1&page=1

下面做下尝试,看看key值可不可以是存放列表的元组77598a1d1b777205cb53ab03e84e98a410d732b5.png

确实不可以,还有一个1和1.0是一样的key的问题8ec049df115e044f2dedb852f9d949c965f2829c.png

其实笔者上面说过现在我用的是python3.4,而在家里用的是python3.6,所以这里没有报错而前面的文章是会报错的。fromkeys是创建一个新的字典aeb2c095c51393cd5d83ea80a93b10b3b5293783.png

python众多对象之一的字典介绍到这,下面是集合

集合也是用花括号来表示的,但是它是没有对应关系的,它和字典一样,也是无序的,不能用索引去访问元素,创建一个集合可以直接用花括号,可以用set工厂函数e0f0db1c24c3c649495178898af94e5f7805e721.png

我们看到{}是一个空字典不是一个空集合,创建空集合可以用set去转换一个空列表。和数学里学到的集合一样,集合的元素必须具有唯一性,这也是集合的用处所在,并且会识别1和1.0是一样的,而且返回了精度更高的。e72fc9d2d733c2c2e282fec717aeef01f997ded4.png

不能用索引去访问(因为集合是无序的),我们来直观的看下无序c0256466c2b362132cd619ab08199beb4b993ff6.png

感觉集合的存储和字典一样是哈希存储,集合元素也应该是经过哈希函数生成id的。

那么我们可以用for和in来访问,可以用in来判断元素是否在集合里e2666721c5beb6799d7ac9cf170e1f3ae8cb16b3.png

集合有什么用处呢?唯一的用处就是唯一,哈,这就话有点绕f5bd475be8eb53cbae53ed7f473ed596aeaa5100.png

可以用上图中的for来消除列表中的重复元素,也可以直接用c那条语句,但是注意由于集合是无序的(虽然它内部有哈希函数会排序,但是用户是不可操作的,所以我们说字典和集合是无序的,并且字典里的key和集合里的元素都是唯一的),c中0就被放到了最前面,如果你不希望列表中元素顺序被改变,那么还是不要用set,用前面for循环去做。

集合里的元素是哈希的3305a205decafbf5c2be4f327931f5feef44dc14.png

ce24e7a39953afe6cf9a7e1bcd0ddce33faa8525.png

上图看到集合也不是哈希的,因为它可以被改变

下面就介绍几个内置方法改变集合的元素,一个是add一个是remove99b246f5b0519f941fbcd5827e758088c01e0162.png

add就是加元素,remove是移除,如果remove的元素集合里没有,那就报错,并且一次只能移除一个参数

如果你希望一个集合不可以被改变,你可以用frozenset5bf2b7106051319f059daccf4a86e3fc925ce9c5.png

b0bba48a011e50f80de6876631dd51d07e56ccbc.png

从上面的图我们可以看到,

1.frozenset没有add,clear,remove这些改变元素的内置方法,但是copy可以用,它不影响原集合。这里对比一下元组和字符串7867ce87f929f25fe2ac6332d38b9d148f3e7527.png

元组和字符串没有copy内置方法。

2.frozenset是hash的,它可以作为一个元素在集合里。

3.clear之后集合是个空集合,这也是创建一般空集合(不是frozenset)的方式9bdab8a5da9874dc2f66baa8c37617e4f71d9989.png

看集合中有多少元素很简单,用len这个bif。这里还看到clear后的类型都是nonetype但是你再看a就是一个空的集合或者列表,这一点用的时候要注意。

下面提供一个内置方法总结,集合不是重点,只是列出来d26971fed4d617a3e81b2eb8c80718615af93c7f.png

e3b2b2ead982ac625b7d181ff48c48bb174b3511.png

以上集合内置方法摘自http://bbs.fishc.com/thread-45276-1-1.htmlbe43d981a212ef9eff69f13bbbc3e8ba2f521978.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值