基本数据类型补充,set集合,深浅拷贝等
1.join:将字符串,列表,用指定的字符连接,也可以用空去连接,这样就可以把列表变成str
1 2 3 4 | ll = [ "wang" , "jian" , "wei" ] #可以通过这个方式将列表变成字符串 ll1 = "".join(ll) print (ll1) # wangjianwei |
2.list来迭代的过程中改变,索引也会改变
问题:将列表中姓"周"的删除,lis = ["周杰伦","周润发","周树人","马化腾"]
看到这个问题首先第一反应就是for循环做判断,然后remove,然后并非如此.
1 2 3 4 5 6 | lis = [ "周杰伦" , "周润发" , "周树人" , "马化腾" ] for n in lis: if n[ 0 ] = = "周" : lis.remove(n) print (lis) # ['周润发', '马化腾'] |
这代码,这逻辑,没毛病吧,但是为什么呢???
原因就在于这个for循环,简单来说for循环是要根据一个指标(索引)去循环,当循环第一个值时,被if命中,执行remove,那么列表中的索引就发生了变化,当周杰伦别删除时,周润发就代替了周杰伦索引为"0"的位置,而这时,for循环的下一个循环目标是索引1,这时候索引为0的周润发巧妙的躲过了这次循环.最终导致该删除的没有别删除干净.
那么怎么解决这个问题呢,很简单,既然在这个列表for循环的时候不能操作,那就把我要删除的值在循环的时候拿出来,然后来删除不就行了.代码如下:
1 2 3 4 5 6 7 8 | li = [] lis = [ "周杰伦" , "周润发" , "周树人" , "马化腾" ] for n in lis: if n[ 0 ] = = "周" : li.append(n) for j in li: lis.remove(j) print (lis) |
3.字典的for循环
有如下题目:算出主播的平均收入,然后将低于平均值的主播干掉,zhubo = {'卢本伟':122000,'冯提莫':189999,'金老板':99999,'吴老板':25000000,'alex':126}
既然上面提到了列表在for循环中有问题,那么字典也不排除,直接上错误代码..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | zhubo = { '卢本伟' : 122000 , '冯提莫' : 189999 , '金老板' : 99999 , '吴老板' : 25000000 , 'alex' : 126 } del_list = [] sum = 0 for n in zhubo.values(): sum + = n sum = sum / len (zhubo) for j in zhubo.keys(): if zhubo[j] < sum : del zhubo[j] print (zhubo) 错误提示: for j in zhubo.keys(): RuntimeError: dictionary changed size during iteration |
这个错误提示的大概意思是说,字典在迭代的过程中不能改变大小.所以想在字典循环的时候在对字典做增删改是不可能了.要想操作的话只能按照上面列表的方式(肯定还有其他的办法),直接上代码.
1 2 3 4 5 6 7 8 9 10 11 12 | zhubo = { '卢本伟' : 122000 , '冯提莫' : 189999 , '金老板' : 99999 , '吴老板' : 25000000 , 'alex' : 126 } del_list = [] sum = 0 for n in zhubo.values(): sum + = n sum = sum / len (zhubo) for j in zhubo.keys(): if zhubo[j] < sum : del_list.append(j) for q in del_list: del zhubo[q] print (zhubo) |
4.fromkey的使用及深坑位置
dict中的fromkey(,可以帮助我们创建新的dict)
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 方法一 # dic = {} # s = dic.fromkeys("周杰伦","昆凌") # print(s) # {'周': '昆凌', '杰': '昆凌', '伦': '昆凌'} # 可以看出将fromkey中的第一个值迭代了,成为每一个value的key,创建出来的是一个value相同,key不同的字典.(第一个值需要可迭代) # 方法二 dic = {} ss = dict .fromkeys([ 1 , 2 , 3 , 4 ], "球员" ) print (ss) # {1: '球员', 2: '球员', 3: '球员', 4: '球员'} #这一种方式也能实现 |
# ***************深坑请注意***************
# 仔细看下方法二..............定义的空字典的变量名为dic,而使用fromkey的时候却用的dict,dict是一个类,一个关键字,不过和方法一是同一个效果
原因就是fromkey是针对类的操作,而不是针对象的,也叫"静态方法"
set有时间在补充吧
深浅拷贝
对于深浅拷贝,我没有太多的例子,不过总结了几句话.
1>.赋值,任何类型的数据进行赋值,就相当于windows的快捷方式,本质其实都是一个,一个修改全部都会变.
2>.字符串,数字无论是赋值,浅拷贝,深拷贝,在内存中全都是一个id
3>.除了字符串,数字其他的,浅拷贝: 就是拷贝最外层的,里面的还是以前的.
4>.除了字符串,数字,其他的深拷贝: 拷贝所有,但是不拷贝最后一层也就是字符串或数字.
5>.通过拷贝方式创建对象,要比正常创建快很多
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步