1. 程式人生 > >day7 集合 深淺copy

day7 集合 深淺copy

 

1昨日內容回顧

小資料池:
int  -5~256
str  特殊字元,*數字20


ascii :  8位 1位元組  表示1個字元
unicode  32位  4個位元組  表示一個字元
utf- 8  1個英文 8位,1個位元組
        歐洲 16位   兩個位元組  表示一個字元
        亞洲 24位   三個位元組  表示一個字元

gbk    1個英文 8位,1個位元組
        亞洲 16位   兩個位元組  表示一個字元

s = 'alex'
b = s.encode('utf-8')
print(b)  # b'alex'

1,基礎資料型別彙總補充
str
int
list
    在迴圈一個列表時,最好不要刪除列表中的元素,這樣會使索引發生改變,從而報錯。
bool
dict
    
1,fromkeys() tuple 2,集合set 3,深淺copy

2 基礎資料型別彙總

字串 列表

 

#str
print(''.isspace())
#list
lis=[11,22,33,44,55]
for i in range(len(lis)):
    print(i,lis[i])    ###i=lis的索引值
    # del lis[i]      #迴圈列表時刪除元素時 索引值會改變,從而報錯 1[22, 44, 55]2[22, 44]3

<<<
False
0 11
1 22
2 33
3 44
4 55
lis=[11,22,33,44,55]
# 打印出lis中的奇數的三種方法: # 第一種 #按切片取值 lis=lis[::2] print("\n") print(lis) # 第二種 新增到一個新列表裡面 lis=[11,22,33,44,55] li=[] for i in lis: #i是list裡面的元素 注意和range區分 if lis.index(i)%2!=1: li.append(i) lis=li print(lis) # 第三種 #反向刪除列表中的元素 lis=[11,22,33,44,55] for i in range(len(lis)-1,-1,-1): #刪除列表的元素要想索引值不改變 可以反向刪除
# for i in range(len(lis)): if i%2==1: # print(i) del lis[i] # print(lis) print(lis) <<< [11, 33, 55] [11, 33, 55] [11, 33, 55]

字典

 

# dic
dic=dict.fromkeys(range(1,4),"春哥")  #keys必須是可迭代物件(序列) eg:字串 列表 元祖 range
print(dic)
dic=dict.fromkeys(range(1,4),[])
dic[1].append("園姐")  #只有列表有append的方法
print(dic)
dic[2].append("二哥")
print(dic)
#迴圈時不能刪除字典 會報錯

1 #建立一個空字典
dic={'k1':"v1",'k2':"v2","a3":"v3"}
dic1={}
for i in dic:
    if "k" in i:
        dic1.setdefault(i,dic[i])
dic=dic1
print(dic)
# 2把字典中的元素放到一個空列表 再對空列表迴圈
dic={'k1':"v1",'k2':"v2","a3":"v3"}
l=[]
for i in dic:
    if "k" not in i:
        l.append(i)
for i in l:
    del dic[i]
print(dic)

<<<
{1: '春哥', 2: '春哥', 3: '春哥'}
{1: ['園姐'], 2: ['園姐'], 3: ['園姐']}
{1: ['園姐', '二哥'], 2: ['園姐', '二哥'], 3: ['園姐', '二哥']}
{'k1': 'v1', 'k2': 'v2'}
{'k1': 'v1', 'k2': 'v2'}

 

元祖

 

tu1=([1],)
tu2=([1])
print(tu1,tu2,type(tu1),type(tu2))
<<<
([1],) [1] <class 'tuple'> <class 'list'>

 

集合

 

#集合:可變的資料型別,它裡面的元素必須是不可變的資料型別,無序,不重複
set1={'alex','wusir','ritian','egon','barry'}
set2=set({1,2,3})
print(set1,set2,type(set1),type(set2))
#
set1.add('女神')
set1.update('abc')
print(set1)

#
set2={'alex','wusir','ritian','egon','barry'}
print(set2.pop())#隨機刪除 有返回值
print(set2)
print(set2.remove('alex')) #按元素刪除 返回None
print(set2)
print(set2.clear()) #清空clear 返回None,清空完原集合成為空集 set() 不是{}(與字典區分)
print(set2)
del set2 #刪除集合

#
set3={'alex','wusir','ritian','egon','barry'}
for i in set3: #無序返回集合的每一個元素
    print(i)

#集合的交併
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) #set1獨有的
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是1的超集

#去重
li=[1,2,33,33,4,6,6,8,8,9,9,9]
set4=set(li) #把列表轉換成集合
print(set4)
li=list(set4)
print(li)

s=frozenset('barry') # frozenset() 返回一個凍結的集合,凍結後集合不能再新增或刪除任何元素。
for i in s:           #沒有add,pop等操作
    print(i)

<<<
{'ritian', 'barry', 'alex', 'wusir', 'egon'} {1, 2, 3} <class 'set'> <class 'set'>
{'ritian', 'barry', 'alex', '女神', 'c', 'a', 'wusir', 'egon', 'b'}
ritian
{'barry', 'alex', 'wusir', 'egon'}
None
{'barry', 'wusir', 'egon'}
None
set()
ritian
barry
alex
wusir
egon
{4, 5}
{4, 5}
{1, 2, 3, 4, 5, 6, 7, 8}
{1, 2, 3, 4, 5, 6, 7, 8}
{1, 2, 3, 6, 7, 8}
{1, 2, 3, 6, 7, 8}
{1, 2, 3}
{1, 2, 3}
True
True
True
True
{1, 2, 33, 4, 6, 8, 9}
[1, 2, 33, 4, 6, 8, 9]
b
y
r
a

 

深淺copy

 

'''直接賦值:其實就是物件的引用(別名)。

淺拷貝(copy):拷貝父物件,不會拷貝物件的內部的子物件。

深拷貝(deepcopy): copy 模組的 deepcopy 方法,完全拷貝了父物件及其子物件。'''
#深淺copy
#賦值
l1=[]
l2=l1
l3=l1
l3.append("a")
print(l1,l2,l3,id(l1),id(l2),id(l3))

#copy 淺拷貝
l1=[1,2,[4,5,6],3]
l2=l1.copy()
print(l1,l2,id(l1),id(l2))
l1.append('a')
print(l1,l2,id(l1),id(l2))   #第一層地址不相同  第一層l2不會隨l1改變
l1[2].append('a')
print(l1,l2,id(l1),id(l2))
print(id(l1[2]),id(l2[2])) #重點  第二層地址及以上地址相同

import copy
l1=[1,2,[4,5,6],3]
l2=copy.deepcopy(l1)
print(l1,l2,id(l1),id(l2))
l1[2].append('a')
print(l1,l2,id(l1),id(l2))
print(id(l1[2]),id(l2[2]))   #深拷貝與淺拷貝的區別是 不管多少層 倆個列表完全獨立

l1=[1,[1],2,3,4]
l2=l1[:] #也是淺拷貝 相當於l2=l1.copy()
print(l1,l2,id(l1),id(l2))
l1[1].append('a')
print(l1,l2,id(l1[1]),id(l2[1]))
<<< ['a'] ['a'] ['a'] 1927665312328 1927665312328 1927665312328 [1, 2, [4, 5, 6], 3] [1, 2, [4, 5, 6], 3] 1927696924744 1927696884808 [1, 2, [4, 5, 6], 3, 'a'] [1, 2, [4, 5, 6], 3] 1927696924744 1927696884808 [1, 2, [4, 5, 6, 'a'], 3, 'a'] [1, 2, [4, 5, 6, 'a'], 3] 1927696924744 1927696884808 1927697092360 1927697092360 [1, 2, [4, 5, 6], 3] [1, 2, [4, 5, 6], 3] 1927697037384 1927696924744 [1, 2, [4, 5, 6, 'a'], 3] [1, 2, [4, 5, 6], 3] 1927697037384 1927696924744 1927697038792 1927697037192 [1, [1], 2, 3, 4] [1, [1], 2, 3, 4] 1927697092360 1927697037384 [1, [1, 'a'], 2, 3, 4] [1, [1, 'a'], 2, 3, 4] 1927696884808 1927696884808

 

l1=['alex','taibai','wusir','egon']
for i in l1:
    print(l1.index(i),i)

for index,i in enumerate(l1,1):
    print(index,i)


<<<
0 alex
1 taibai
2 wusir
3 egon
1 alex
2 taibai
3 wusir
4 egon