1.基础数据类型汇总补充
list :再循环一个列表时,最好不要删除列表的元素,这样会使索引发生改变,从而报错。
lis = [11,22,33,44,55] #列表最后保留[11,33,55] del lis[1::2] #直接删 print(lis) li = [] for i in lis: if lis.index(i) % 2 == 0: li.append(i) lis = li print(li) for i in range(len(lis)-1,-1,-1): if i % 2 == 1: del lis[i] print(lis)
bool: false: 0 '' [] () {} set()
dict:再循环一个字典时,不要删除字典里面的键值对,会报错。
dic = dict.fromkeys #fromkeys()自动引用dict dic ={'k1':'v1','k2':'v1','a3':'v3'} #删除有'k'的键值对 dic1 = {} for i in dic: if 'k' not in i: dic1.setdefault(i,dic[i]) dic = dic1 print(dic) l = [] for i in dic: if 'k' in i: l.append(i) for i in l: del dic[i] print(dic)
tuple:
tu1 = (1) tu2 = (1,) print(tu1,type(tu1)) print(tu2,type(tu2))
如果只有一个元素且不加,那此元素是什么类型就是什么类型。
2.集合set
集合{}是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点:
1.去重,把一个列表变成集合,就自动去重了。
2.关系测试,测试两组数据之前的交集、差集、并集等关系。
set1 = set({1,2,3}) print(set1) set2 = {1,2,3,[2,3],{'name':'ssss'}} #错的
集合的增:
set1 = {'sole','memory','xiaoz','ban'} set1.add('希望') set1.update('A') #update:迭代着增加 set1.update([1,2,3])
集合的删:
set1 = {'sole','memory','xiaoz','ban'} set1.pop() #随机删除 有返回值 set1.remove('alex') #按元素删除,没有就报错 set1.clear() #清空集合 del set1 #删除集合
集合的查:
set1 = {'sole','memory','xiaoz','ban'} for i in set1: # 只有一种for循环 print(i)
集合的其他操作:
交集 (& 或者 intersection)
set = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set & set2) # {4,5} print(set.intersection(set2)) # {4,5}
并集(| 或者 union)
set = {1, 2, 3, 4, 5} set2 = {4, 5, 6, 7, 8} print(set | set2) # {1, 2, 3, 6, 7, 8} print(set.union(set)) # {1, 2, 3, 6, 7, 8}
差集(- 或者 difference)
set = {1, 2, 3, 4, 5} set2 = {4, 5, 6, 7, 8} print(set - set2) # {1, 2, 3} print(set2.difference(set2)) # {1, 2, 3}
反交集(^ 或者 symmetric_difference)
set = {1, 2, 3, 4, 5} set2 = {4, 5, 6, 7, 8} print(set ^ set2) # {1, 2, 3, 6, 7, 8} print(set.symmetric_difference(set2)) # {1, 2, 3, 6, 7, 8}
子集与超集
set = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set < set2) print(set.issubset(set2)) # 这两个相同,都是说明set1是set2子集。 print(set2 > set) print(set2.issuperset(set)) # 这两个相同,都是说明set2是set1超集。
frozenset不可变集合,让集合变成不可变类型。
s = frozenset('sole') print(s,type(s)) # frozenset({'s', 'o, 'l', 'e'}) <class 'frozenset'>
3.深浅copy
赋值运算
l1 = [1,2,3,['sole','memory']] l2 = l1 l1[0] = 111 print(l1) # [111, 2, 3, ['sole', 'memory']] print(l2) # [111, 2, 3, ['sole', 'memory']] l1[3][0] = 'wawu' print(l1) # [111, 2, 3, ['wawu', 'memory']] print(l2) # [111, 2, 3, ['wawu', 'memory']]
对于赋值运算来说,l1与l2指向的是同一个内存地址,所以他们是完全一样的。
浅copy
l1 = [1, 2, 3, ['sole', 'memory']] l2 = l1.copy() print(l1, id(l1)) # [1, 2, 3, ['sole', 'memory']] 2604585117704 print(l2, id(l2)) # [1, 2, 3, ['sole', 'memory']] 2604585134984 l1[1] = 222 print(l1, id(l1)) # [1, 222, 3, ['sole', 'memory']] 2604585117704 print(l2, id(l2)) # [1, 2, 3, ['sole', 'memory']] 2604585134984 l1[3][0] = 'wawu' print(l1, id(l1[3])) # [1, 222, 3, ['wawu', 'memory']] 2604585132488 print(l2, id(l2[3])) # [1, 2, 3, ['wawu', 'memory']] 2604585132488
对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。
深copy deepcopy 必须用import
import copy l1 = [1,2,3,['sole','memory']] l2 = copy.deepcopy(l1) print(l1,id(l1)) # [1, 2, 3, ['sole', 'memory']] 3031168225992 print(l2,id(l2)) # [1, 2, 3, ['sole', 'memory']] 3031168226504 l1[1] = 222 print(l1,id(l1)) # [1, 222, 3, ['sole', 'memory']] 3031168225992 print(l2,id(l2)) # [1, 2, 3, ['sole', 'memory']] 3031168226504 l1[3][0] = 'wawu' print(l1,id(l1[3])) # [1, 222, 3, ['wawu', 'memory']] 3031168228168 print(l2,id(l2[3])) # [1, 2, 3, ['sole', 'memory']] 3031168228232
对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变。
enumerate:枚举 对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串)
enumerate将其组成一个索引序列,利用它可以同时获得索引和值。
li = ['sole','梦想','女神','memory'] for i in enumerate(li): print(i) for index,name in enumerate(li,1): print(index,name) for index, name in enumerate(li, 100): # 起始位置默认是0,可更改 print(index, name)