python修炼之路-day7

一、基础数据类型补充

  str.join()  : 把列表变成字符串,遍历列表,依次把str插入到遍历的列表值末尾中,组成一个新的字符串

1 b = "&"
2 c = b.join(['gailun', 'zhaoxin', 'huangzi', 'manzi', 'jiansheng'])
3 print(c)

>>>>>>>>> gailun&zhaoxin&huangzi&manzi&jiansheng

  列表在循环的时候不能被删除,因为索引会被改变

1 lst = ['that girl', 'firs', 'smile of her', 'my dream']
2 for i in lst:
3     lst.remove(i)
4 print(lst)

>>>>>>>>>['firs', 'my dream']

  结果显示列表并没有被删除干净,是因为列表循环时,指针会第一个指向索引为0的元素,当索引为0的元素被删除后,索引为1的元素会自动向前进一步,索引变成0,而指针再次寻找时,会指向索引为1的元素,所以原先索引为1的元素会被漏掉,从而导致列表删不干净

1 lst = ['that girl', 'firs', 'smile of her', 'my dream']
2 lst1 = []
3 for i in lst:
4     lst1.append(i)
5 for i in lst1:
6     lst.remove(i)
7 print(lst)

>>>>>>>>>> [ ]

  用一个新列表来记录原列表元素,然后循环新列表来删除原列表的元素         也可以用一下方法来循环删除元素

1 li = ['abc', 'bcd', 'cde', 'edf']
2 for i in range(0, len(li)):    # 循环len(li)次, 然后从后往前删除
3     li.pop()
4 print(li)

>>>>>>>>>> [ ]

  注意: 由于删除元素会导致元素的索引改变, 所以容易出现问题. 尽量不要再循环中直接去删 除元素. 可以把要删除的元素添加到另一个集合中然后再批量删除.

  字典也不能在循环的时候更改大小,如果想要删除字典中的元素,需要使用一个列表来记录要删除的元素,然后遍历列表来删除字典中的元素

1 dic = {'yang': 25, 'pan': 24, 'liu': 21}
2 lst =[]
3 for k in dic:
4     lst.append(k)
5 for i in lst:
6     del dic[i]
7 print(dic)

>>>>>>>>>> { }

  fromkeys()  :  可以通过列表来创建一个字典

1 s = dict.fromkeys(['林俊杰', '陈奕迅', '周杰伦', '黄家驹'], 'shuai')
2 print(s)

>>>>>>>>> {'林俊杰': 'shuai', '陈奕迅': 'shuai', '周杰伦': 'shuai', '黄家驹': 'shuai'}

  也可以通过字典的对象来创建

1 dic = {}
2 s = dic.fromkeys(['林俊杰', '陈奕迅', '周杰伦', '黄家驹'], 'shuai')
3 print(s)

>>>>>>>>> {'林俊杰': 'shuai', '陈奕迅': 'shuai', '周杰伦': 'shuai', '黄家驹': 'shuai'}

二、set集合

  集合的特点: 不重复,无序的,用{ }表示

  注意: set集合中的元素必须是可hash的, 但是set本身是不可hash得. set是可变的.

  使用set的不重复特性来为列表去重

1 lst = ['影流之主', '疾风剑豪', '诡术妖姬', '放逐之刃', '放逐之刃', '疾风剑豪', '卡牌大师']
2 s = set(lst)
3 lst = list(s)
4 print(lst)

>>>>>>>>>>> ['卡牌大师', '放逐之刃', '疾风剑豪', '诡术妖姬', '影流之主']

  集合的增删改查:

增 :

  add() :   # 重复的内容不会被添加进去

  update() :  迭代添加

1 s = {'疾风剑豪', '影流之主', '诡术妖姬', '卡特琳娜', '卡牌大师', '九尾妖狐', '光辉女郎'}
2 s.add('刀锋之影')
3 print(s)

>>>>>>>>>> {'卡特琳娜', '疾风剑豪', '光辉女郎', '诡术妖姬', '影流之主', '刀锋之影', '卡牌大师', '九尾妖狐'}

1 s = {'疾风剑豪', '影流之主', '诡术妖姬', '卡特琳娜', '卡牌大师', '九尾妖狐', '光辉女郎'}
2 s.update('刀锋之影')
3 print(s)

>>>>>>>>>>  {'刀', '卡牌大师', '卡特琳娜', '疾风剑豪', '锋', '之', '光辉女郎', '影流之主', '九尾妖狐', '诡术妖姬', '影'}

删 :

  pop()  :   随机删除一个

  remove()  :  指定元素删除,如果指定的 元素不存在,则会报错

  clear() :   清空集合

 1 s = {"刘嘉玲", '关之琳', "王祖贤", "张曼玉", "李若彤"}
 2 item = s.pop()  # 随机弹出⼀一个.
 3 print(s)
 4 print(item)
 5 
 6 
 7 s.remove("关之琳")  # 直接删除元素 #
 8 s.remove("马虎疼")  # 不不存在这个元素. 删除会报错
 9 print(s)
10 
11 
12 s.clear()    # 清空set集合.需要注意的是set集合如果是空的. 打印出来是set() 因为要和 dict区分的.
13 print(s)    # set()

改 :

  集合不能修改

查 :

  for 循环迭代

  集合常用操作:

交集:

1 lst = {'林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易'}
2 lst1 = {'周杰伦', '周星星', '周润发', '周树人', '林俊杰'}
3 print(lst & lst1)
# 4 print(lst.intersection(lst1))

>>>>>>>>> {'林俊杰'}

并集:

1 lst = {'林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易'}
2 lst1 = {'周杰伦', '周星星', '周润发', '周树人', '林俊杰'}
3 print(lst | lst1)
4 # print(lst.union(lst1))

>>>>>>>>>> {'黄家驹', '周杰伦', '毛不易', '周润发', '陈奕迅', '周树人', '周星星', '林俊杰', '薛之谦'}

差集:

1 lst = {'林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易'}
2 lst1 = {'周杰伦', '周星星', '周润发', '周树人', '林俊杰'}
3 print(lst - lst1)
4 # print(lst.difference(lst1))

>>>>>>>>> {'毛不易', '陈奕迅', '薛之谦', '黄家驹'}

反交集:

1 lst = {'林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易'}
2 lst1 = {'周杰伦', '周星星', '周润发', '周树人', '林俊杰'}
3 print(lst ^ lst1)
4 # print(lst.symmetric_difference(lst1))

>>>>>>>>> {'周杰伦', '陈奕迅', '毛不易', '周润发', '黄家驹', '薛之谦', '周树人', '周星星'}

子集:

1 lst = {'林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易'}
2 lst1 = {'周杰伦', '周星星', '周润发', '周树人', '林俊杰'}
3 print(lst < lst1)
4 # print(lst.issubset(lst1))

>>>>>>>>> False

超集:

1 lst = {'林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易'}
2 lst1 = {'周杰伦', '周星星', '周润发', '周树人', '林俊杰'}
3 print(lst > lst1)
4 # print(lst.issuperset(lst1))

>>>>>>>>> False

三、深浅拷贝

  赋值操作:

1 lst = ['林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易']
2 lst1 = lst
3 lst1.append('周杰伦')
4 print(lst)
5 print(lst1)

>>>>>>>>>>> ['林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易', '周杰伦']
>>>>>>>>>>> ['林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易', '周杰伦']

  对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量. 并不是复制一份内容. 所以. lst的内存指向和lst1是一样的. lst1改变了, lst也发生了改变

  浅拷贝:

1 lst = ['yasuo', 'xiazi', 'yingliu']
2 lst1 = lst.copy()
3 # lst1 = lst[:]     # 切片也是复制
4 lst.append('shitouren')
5 lst1.append('jiqiren')
6 print(lst)
7 print(lst1)

>>>>>>>>>>>> ['yasuo', 'xiazi', 'yingliu', 'shitouren']
>>>>>>>>>>>> ['yasuo', 'xiazi', 'yingliu', 'jiqiren']

  两个lst完全不一样. 内存地址和内容也不一样. 发现实现了内存的拷贝,浅拷贝只能实现第一层的拷贝

  深拷贝:

1 import copy
2 
3 lst = ['林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易', ['田馥甄', 'jc', '于文文']]
4 lst1 = copy.deepcopy(lst)
5 lst[5].append('杨钰莹')
6 print(lst)
7 print(lst1)

>>>>>>>>>>>>>> ['林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易', ['田馥甄', 'jc', '于文文', '杨钰莹']]
>>>>>>>>>>>>>> ['林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易', ['田馥甄', 'jc', '于文文']]

  深度拷贝. 把元素内部的元素完全进行拷贝复制. 不会产生一个改变另一个跟着改变的问题

猜你喜欢

转载自www.cnblogs.com/child-king/p/9289973.html