基础数据类型补充:
元组:如果元组中只有一个数据,且没有逗号,则该 '元组' 与里面的数据的数据类型相同。
tu1 = (1,)
tu2 = ('alex')
tu3 = ([1,2,3],)
print(tu1,type(tu1))
print(tu2,type(tu2))
print(tu3,type(tu3))
列表 列表与列表可以相加
l1 = [1,2,3]
l2 = ['alex','wusir']
l3 = l1 + l2
print(l3)
在循环一个列表时,如果对列表中的某些元素进行删除,
那么此元素后面的所有元素就会向前进一位,他们的索引就会发生变化
在循环一个列表时,最好不要对此列表进行改变大小(增删)的操作。
字典:
fromkeys()
dic1 = dict.fromkeys([1,2,3],'alex')
print(dic1)
结果:{1: 'alex', 2: 'alex', 3: 'alex'}
面试题:创建字典的方式
1,
dic = {'name':'alex'}
2
dic = dict({'name':'alex'})
print(dic)
3, fromkeys()
陷阱:
dic1 = dict.fromkeys([1,2,3],[])
print(dic1)
# dic1[1].append('alex')
print(dic1)
print(id(dic1[1]))
print(id(dic1[2]))
print(id(dic1[3])) #3个值都会变化
dic = {'key1': 'value1','key2': 'value2', 'k3':'v3', 'name': 'alex'} # 将 dic的键中含有k元素的所有键值对删除。 # for key in dic: # if 'k' in key: # dic.pop(key) #dictionary changed size during iteration: #在循环一个字典时,不能改变字典的大小。 l1 = [] for key in dic: if 'k' in key: l1.append(key) # print(l1) for key in l1: dic.pop(key) print(dic)
str ---> list
s1 = 'alex wusir taibai'
l1 = s1.split()
print(l1)
list ---> str 此list中的元素全部是str类型
l1 = ['alex', 'wusir', 'taibai', 100]
# s2 = ' '.join(l1)
# print(s2)
tuple <---> list
l1 = [1,2,3]
tu1 = tuple(l1)
print(tu1)
tu2 = (0,2,3)
l1 = list(tu2)
print(l1)
0 " [] () {} set() ---> bool False
集合:
面试必考:list去重 *****
l1 = [1,1,2,3,4,4,3,2,1,5,5]
set1 = set(l1)
l2 = list(set1)
print(l2)
增
set1.add('女神')
print(set1)
set1.update('abc')
print(set1)
删
set1.remove('alex') 按元素删除
print(set1)
set1.pop() 随机删除
print(set1)
set1.clear() 清空
print(set1)
del set1 删除集合
print(set1)
frozenset不可变集合,让集合变成不可变类型
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a
{'a', 'r', 'b', 'c', 'd'}
差集。(- 或者 difference)a - b # 集合a中包含元素
{'r', 'd', 'b'}
并集。(| 或者 union)a | b # 集合a或b中包含的所有元素
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
交集。(& 或者 intersection)a & b # 集合a和b中都包含了的元素
{'a', 'c'}
反交集。 (^ 或者 symmetric_difference)a ^ b #不同时包含于a和b的元素
{'r', 'd', 'b', 'm', 'z', 'l'}
4.5子集与超集
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超集。
深浅copy:
赋值运算 对于赋值运算来说,l1与l2指向的是同一个内存地址,所以他们是完全一样的
l1 = [1,2,3,['barry','alex']] l2 = l1 l1[0] = 111 print(l1) # [111, 2, 3, ['barry', 'alex']] print(l2) # [111, 2, 3, ['barry', 'alex']] l1[3][0] = 'wusir' print(l1) # [111, 2, 3, ['wusir', 'alex']] print(l2) # [111, 2, 3, ['wusir', 'alex']]
浅拷贝copy 对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性
l1 = [1,2,3,['barry','alex']] l2 = l1.copy() print(l1,id(l1)) # [1, 2, 3, ['barry', 'alex']] 2380296895816 print(l2,id(l2)) # [1, 2, 3, ['barry', 'alex']] 2380296895048 l1[1] = 222 print(l1,id(l1)) # [1, 222, 3, ['barry', 'alex']] 2593038941128 print(l2,id(l2)) # [1, 2, 3, ['barry', 'alex']] 2593038941896 l1[3][0] = 'wusir' print(l1,id(l1[3])) # [1, 2, 3, ['wusir', 'alex']] 1732315659016 print(l2,id(l2[3])) # [1, 2, 3, ['wusir', 'alex']] 1732315659016
深拷贝deepcopy 对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变
import copy l1 = [1,2,3,['barry','alex']] l2 = copy.deepcopy(l1) print(l1,id(l1)) # [1, 2, 3, ['barry', 'alex']] 2915377167816 print(l2,id(l2)) # [1, 2, 3, ['barry', 'alex']] 2915377167048 l1[1] = 222 print(l1,id(l1)) # [1, 222, 3, ['barry', 'alex']] 2915377167816 print(l2,id(l2)) # [1, 2, 3, ['barry', 'alex']] 2915377167048 l1[3][0] = 'wusir' print(l1,id(l1[3])) # [1, 222, 3, ['wusir', 'alex']] 2915377167240 print(l2,id(l2[3])) # [1, 2, 3, ['barry', 'alex']] 2915377167304