元组
如果元组中只有一个数据,且没有逗号,则该‘元组’与里面的数据的数据类型相同。
tu1 = (1) tu2 = (1,) print(tu1, type(tu1)) print(tu2, type(tu2)) tu3 = ('alex') tu4 = ('alex',) tu5 = ([1,2,3]) print(tu3, type(tu3)) print(tu4, type(tu4)) print(tu5, type(tu5))
列表
列表与列表可以相加
l1 = [1, 2, 3] l2 = ['alex', 'wusir'] l3 = l1 + l2 print(l3)
在循环一个列表时,最好不要对此列表进行改变大小(增删)操作
l1 = [11, 22, 33, 44, 55, 66, 77] # 将列表中索引为奇数的元素全部删除 # 方法一:切片+步长删除 # del l1[1::2] # print(l1) # for i in l1: # if l1.index(i) % 2 ==1: # l1.pop(l1.index(i)) # print(l1) ''' # 在循环一个列表时,如果对列表中的某些元素进行删除, # 那么此元素后面的所有元素就会向前进一位,他们的索引就会发生变化。 ''' # 方法二 将元素取出来添加到新列表,再将新列表赋值到原列表 l1 = [11, 22, 33, 44, 55, 66, 77] l2 = [] for i in range(len(l1)): if i % 2 == 0: l2 .append(l1[i]) print(l2) l1 = l2 print(l1) # 方法三 倒着删除 l1 = [11, 22, 33, 44, 55, 66, 77] for index in range(len(l1)-1, -1, -1): if index % 2 == 1: l1.pop(index) print(l1)
ic = {'key1': 'value1','key2': 'value2', 'k3':'v3', 'name': 'alex'} # 将dic的键中含有k元素的所有键值对删除 ''' for k in dic: if "k" in k: del dic[k] print(dic) 报错原因:dictionary changed size during iteration 在循环一个字典中,不能改变字典的大小。
字典面试题:创建字典的方式
1. dic = {'name':'alex'} 2. dic = dict({'name':'alex'}) 3.fromkeys ''' # fromkeys() dic1 = dict.fromkeys([1, 2, 3], 'alex') print(dic1) #{1: 'alex', 2: 'alex', 3: 'alex'} # 陷阱 dic2 = dict.fromkeys([1, 2, 3], []) print(dic2) #{1: [], 2: [], 3: []} dic2[1].append('alex') print(dic2) #{1: ['alex'], 2: ['alex'], 3: ['alex']} print(id(dic2[1])) #2304578552072 对应同一地址 print(id(dic2[2])) print(id(dic2[3]))
数据类型的转换
int str bool 三者转换
str <--> bytes
str <--> list
dict.key() dict.values() dict.item() 都可以转换成列表
tuple <--> list
dic --> lsit
# str --->lsit s1 = 'alex wuris taibai' l1 = s1.split() print(l1) # list --->str 前提此list中的元素全部都是str类型 l1 = ['alex', 'wuris', 'taibai'] s1 = ' '.join(l1) print(s1) # list --->tuple l1 = [1, 2, 3] tu1 = tuple(l1) # tuple ---> list tu2 = (1,2,4) l1 = list(tu2) print(l1)
集合与深浅copy
set = {'alex', 'wusir', 1, 2, 3}
集合要求里面的元素必须是不可变的数据类型,但是集合本身是可变的数据类型。
集合里面的元素不重复(天然去重),无序。
主要用途:
1.去重
2.关系测试
list去重***** l1 = [1,1,2,3,4,5,4,6,1,2,2] set1 = set(l1) l2 = list(set1) print(set1) # 增 set1 = {'alex','wusir','ritian','egon','barry'} set1.add('景女神') print(set1) #update:迭代着增加 set1.update('A') print(set1) set1.update('老师') print(set1) set1.update([1,2,3]) print(set1) # 删 set1 = {'alex','wusir','ritian','egon','barry'} set1.remove('alex') # 删除一个元素 print(set1) set1.pop() # 随机删除一个元素 print(set1) set1.clear() # 清空集合 print(set1) # del set1 # 删除集合 # print(set1) # 关系测试 # 交集 set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 & set2) print(set1.intersection(set2)) # 并集 print(set1|set2) print(set1.union(set2)) #反交集 print(set1 ^set2) print(set1.symmetric_difference(set2)) # 差集 print(set1 - set2) print(set1.difference(set2)) # 子集与超集 set1 = {1,2,3} set2 = {1,2,3,4,5,6} print(set1 < set2) print(set1.issubset(set2)) # 这两个相同,都是说明set1是set2子集。 print(set2 > set1) print(set2.issuperset(set1)) # 这两个相同,都是说明set2是set1超集。 # 将集合变成不可变 *** set1 = frozenset(set1) print(set1)
浅copy:第一层在内存中独立的,从第二层开始以及更深的层数,都使用同一个内存地址,一变都变
# 浅copy l1 = [1, 2, 3] l2 = l1.copy() print(l2) print(id(l1)) print(id(l2)) l1 = [1, 2, 3, [22,55]] l2 = l1.copy() l1[-1].append(666) print(l1) print(l2) print(id(l1)) #地址不一样 print(id(l2)) print(id(l1[-1])) #地址一样 print(id(l2[-1]))
深copy:这两个是完全独立的,互不影响
import copy l1 = [1, 2, 3, [22,55]] l2 = copy.deepcopy(l1) l1[-1].append(666) print(l1) print(l2) print(id(l1)) #地址不一样 print(id(l2)) print(id(l1[-1])) #地址不一样 print(id(l2[-1])) ''' 应用场景:面试会考,解释深浅copy 完全独立的copy一份数据,与原数据没有关系,深copy 如果一份数据(列表)第二层时,你想与原数据进行公用,浅copy 面试题2: ''' # 面试题2: 切片属于浅copy l1 = [1, 2, 3, [22, 33]] l2 = l1[:] # l1.append(66) print(l1) print(l2) # l1[-1].append(666) print(l2)