1. 程式人生 > >python的set,和字典的詳細使用方法,以及部分習題

python的set,和字典的詳細使用方法,以及部分習題

作用域 整數 數組 set集合 b- 之前 and 每次 bytes

字符串

一個個字符組成的有序的序列,時字符的集合
使用單引,雙引,三引 引住的字符序列
字符時不可變的對象

bytes定義

bytes不可變字節序列
使用b前綴定義
只允許基本ASCII使用字符形式
支持索引 返回對應的數,int類型

bytearray定義

字節數組
可變
append 可在尾部追加元素
insert   在指定索引位置插入元素
extend  將一個可叠代的整數集合追加到當前bytearray
pop(index=-01)  從指定索引上移除元素,默認從尾部移除
remove(value) 找到第一個value移除,找不到拋出VlaueError異常
上述方法若需要使用int類型,值在【0,
255】 clear()清空bytearray reverse()反轉bytearray ,就地修改 編碼: 字符串按照不同的字符集編碼encode返回字節序列bytes 字節序列按照不同的字符集解碼decode返回字符串

線性結構

可叠代 for...in
len可以獲取其長度
可以通過索引訪問
可以切片

切片

通過索引區間訪問線性結構的一段數據
sequence[start:stop],表示返回[start,stop]區間的子序列
支持負索引
strat為0可以省略
stop為末尾,可以省略
超過上界(右邊界),取到末尾;超過下屆(左邊界),取其開頭
strat一定要在stop的左邊
[:] 表示從頭到尾,全部元素被取出,等效於copy( )方法

封裝和結構

技術分享

解構

把線性結構的元素解開,並順序的賦給其他變量
左邊接納的變量數要和右邊解開的數目一致

python3 的解構

使用 *變量名接收 不能單獨使用
     被 *變量名 收集後組成一個列表

丟棄變量

不成文的約定,不是標準
如果不關心一個變量,可以定位這個變量的名字為__
__是一個合法的標識符,也可以作為一個有效的數量使用,但是定義成下劃線就是希望不被使用,除非明確知道這個數據需要使用
_這變量本身無任何語義,沒有任何可讀性,
     python中有很多庫都是用這個變量,使用十分廣泛,在不明確變量作用域的情況下,使用_和庫中的_沖突

練習

lst=list(range(10)) 取出第二個,第四個,倒數第二個
_,sec,_,F,
*_,n,_=lst 從lst=[1,(2,3,4),5]中,提取4出來 _,(*_,a),_=lst 從JAVA_HOME=/usr/bin,返回變量名和路徑 s=JAVA_HOME=/usr/bin name,_path=s.prtition(=) 總結: 解構,是python中提供的很好的功能,可以方便的提取復雜數據解構的值 配合_的使用,會更加便利

set

可變的,無序的,不重復的元素的集合
set是可叠代的
set可以用來去重
set的元素是要求必須可以hash的
目前已學過的不可hash的類型有 list、set
元素不可以被索引

set增加
add(value)
     增加一個元素到set中
     如果元素存在,什麽都不做
update(*others)
     合並其他元素到set集合中來
     參數others必須是可叠代對象
     就地修改

set刪除
remove(elem)
     從set中移除一個數
     元素不存在,會拋出KeyError錯誤:  通過hash值查找,直接刪除對應hash值的數

discard(elem)
     從set中移除一個元素     
     元素不存在,不會拋錯誤

pop( )-->item
     不可以刪除指定數值
     移除並返回任意的元素,
     空集返回KeyError異常
     
clear( )
     移除所有元素

set的修改和查詢
     修改:
          要麽刪除,要麽加入新的元素,沒有修改
     
     查詢:
          非線性結構,無法索引
 
     遍歷:
          可叠代所有元素

成員運算符:
     in和not in 可以判斷元素是否在set中
     
set和線性結構
線性結構的查詢時間復雜度都是O(n),隨著數據規模增大,耗時增加
ser、dict等結構,內部使用hash值作為key,時間復雜度可以為O(1),查詢時間和數據規模無關

可hash
     數值型 int、float、complex
     布爾型 True、False
     字符串 string、bytes
     tuple
     None
     以上都是不可變類型,成為可hash類型,hashable
set的元素必須是可hash的

集合

 基本概念
          全集
                    所有元素的集合,如實數集,所有實數組成的集合就是全集
          子集
                    一個集合A所有元素都在另一個集合B內,A是B的子集,B是A的超集
          真子集和真超集
                    A是B的子集,且A不等於B,A就是B的真子集,B是A的真超集
          並集: 多個集合合並的結果
          交集:多個集合的公共部分
          差集: 集合中出去和其他集合公共部分

並集

技術分享

將兩個集合A和B所有的元素合並到一起,組成的元素乘坐集合A與集合B的並集 比較運算: union(*others) union用法:技術分享

返回和多個集合合並後的新集合(如圖所示A與B的相交部分)、

   ”|“:      union的代表符號

          update(*others): 和多個集合合並,就地修改
          update的用法:技術分享

       = : update的代表符號

交集:

      集合A和B由所有屬於A且屬於B的元素組成的集合(如下圖所示):
     

          intersection(*others)
                    返回多個集合的交集(如下圖所示):
                              技術分享
&          :intersection的代表符號
        
           intersection_update(*others)
               獲取和多個集合的交集,並就地修改
          &=     :intersection_updated 的表示符號

差集

差集
               集合A和B,由所有屬於A且不屬於B的元素組成的集合(如圖所示):
              技術分享
               diffrernce(*others)的用法
               技術分享
                    返回多個集合的差集
          
               — : 表示為 difference的符號

               difference_(update):
                    獲取和多個集合的差集並就地修改
              技術分享

=  :  表示為difference_(update)的符號

對稱差集

   對稱差集:
                    集合A和B,由所有不屬於A和B的交集元素組成的集合,記作(A-B)U(B-A):
                技術分享
               symmetric_differece(other)  
               技術分享
               返回和另一個集合的差集
               ”^“    表示為symmetric_differece的表示符號
               symmetric_differece_update(other)
               技術分享
                獲取另一個集合的差集並就地修改
               ”^=“ 表示為symmetric_differece_update(other)的使用符號
           issubset(other)、<=:
               判斷當前集合是否是另一個集合的子集
           
           set1<set2:
               判斷set1是否是set2的真子集
          
          issuperset(other)、>=
               判斷set1是否是set的真超集

          isdisjoint(other)
               當前集合和另一個集合沒有交集;沒有交集,返回True

集合練習:

 共同好友;
          你的好友A,B,C 他的好友C,B,D, 求共同好友:
          交集問題: {A,B,C}.intersection({B,C,D})
             技術分享  

          微信群提醒:
               XXX與群裏其他人都不是微信朋友關系
                    並集:userid in (A|B|C|...)==FLASE,   A , B , C等是好友的並集,用戶ID不在這個並集中,說明他和任何人都不是朋友

          權限判斷:
               有一個API,要求同時具備A,B,C權限才能訪問,用戶權限B,C,D,判斷該用戶能否訪問該API
               API集合為A,權限集合為P;A-P={},AP為空集,說明 P包含A
                                                        A.issubset(P)也行,A是P的子集
                                                        A&P=A也可以
               有一個API,要求具備A,B,C任意一項權限就可訪問,用戶權限B,C,D ,判斷該用戶能否訪問該API
               一個總任務列表,儲存所有任務,一個完成的任務列表。找出未完成的任務
                技術分享              
               設所有的工作為ALL,已完成的工作為COMPLETED 用所有的減去已完成的得出未完成的
               
集合練習:
               隨機產生2組各個數字的列表,如下要求:
                    每個數字取值範圍[10,20]
                    統計20個數字中,一共有多少個不同的數字?
                    2組中,不重復的數字有幾個?分別是什麽?
                    2組中,重復的數字有幾個?分別是什麽?

技術分享

答案依次為:

技術分享

字典

字典:
字典為 key-vlaue 鍵值對的數據的集合;字典是可變的,無序的,key不重復

字典的定義,初始化:
     字典常用的用法為 : dict(**kwargs) 使用name=value 對一個字典初始化
      dict(可叠代,**kwarg)使用可叠代對象和name=value對構造字典,不過可叠代對象的元素必須是一個二元結構
      dict(mapping,**kwarg)使用一個字典構造另外一個字典
      d={a:10,b:20,c:None,d:[1,2,3]}
字典元素的訪問:
      d[key]: 返回key對應的值value;key不存在拋KeyError異常
      get(key,[,default]): 返回key對應的值value,key不存在返回缺省值,如果沒有設置缺省值返回None
      setdefault(key[,default]):返回key對應的值value,key不存在,添加kv對.值為default,並返回default,如果default沒有設置,缺省為None

字典增加和修改:
     d[key]=value :將key對應的值修改為value(新值),key不存在添加新的kv對
      update([other])-->None:
      使用另一個字典的kv對更新本字典;key不存在,就添加;key存在,覆蓋已經存在的key對應的值;就地修改

字典刪除:
       pop(key[,default]):
            key存在,移除它,並返回他的value
            key不存在,返回給定的default     
            default未設置,key不存在則排除KeyError異常
      popitem()
            移除並返回一個任意的鍵值對
            字典為空,拋出KeyError異常
      clear()       清空字典

字典刪除:
          del語句

字典練習:

技術分享

第二題:
import random
randomnumber=[]
countlist=[]
randomdict={}
sortlist=[]
for p in range(100):
    randomnumber.append(random.randrange(-1000,1000))
    countlist.append(randomnumber.count(randomnumber[p]))
    randomdict[randomnumber[p]]=countlist[p]

for k,v in randomdict.items():
    sortlist.append((k,v))
sortlist.sort()
print(sortlist)

輸出結果:技術分享

習題一:

nums=input(>>>)

count_list=[]
sort_list={}
sort_list1=[]
for i in range(len(nums)):

    count_list.append(nums.count(nums[i]))
    sort_list[nums[i]]=count_list[i]

for k,v in sort_list.items():
    sort_list1.append((k,v))

print(sort_list1)

輸出結果:

技術分享

習題三:

import random
s1=[]
same_alpha=[]
count_list={}
diff_alpha=[]
alpha=abcdefghijklmnopqrstuvwxyz
for _ in range(100):
    s1.append(random.choice(alpha)+random.choice(alpha))
    same_alpha.append(s1.count(s1[_]))
    count_list[s1[_]]=same_alpha[_]
   
#進行排序
for k,v in count_list.items():
    diff_alpha.append((k,v))
diff_alpha.sort(reverse=True)
print(diff_alpha)

輸出結果為:

技術分享

選擇排序:

選擇排序使用方法
     簡單選擇排序:
          屬於選擇排序,兩兩比較大小,找出最大值和最小值;被放在固定的位置,固定位置一般在某一端
     結果分為升序和降序
          降序:n個數由左至右,索引從0到-1,兩兩依次比較,並記錄最大值,此輪所有數比較完畢,將最大數和索引0數比較,如果最大數就是索引1,不交換;第二輪由1開始比較,找到最大值,將它和索引1位置交換,如果他就在索引1則不叫喚,依次類推,每次左邊都會固定下一個大數
          升序:
             和降序相反

簡單排序總結:
     簡單排序需要 數據一輪輪比較,並在每一輪中發現極值
     沒有辦法知道當前輪是否已經達到排序要求,但可以知道極值是否在目標索引位置上
     遍歷次數1,....,n-1和n(n-1)/2
     時間復雜度為O(n的平方)
     減少了交換次數,提高了效率,性能略好於冒泡法

選擇排序練習:

技術分享

將上述列表第二列利用選擇排序進行排序

m_list=[[1,9,8,5,6,7,4,3,2],
        [6,5,8,7,9,4,2,1,3],
        [9,8,7,6,5,4,3,2,1]]
nums = m_list[1]
length=len(nums)
print(nums)

for i in range(length):
    maxindex=i
    for j in range(i+1,length):
        if nums[maxindex] < nums[j]:
            maxindex = j
# print(nums)
    if i != maxindex:                        #第二次判斷兩個索引是否相等,若相等則說明該值已是最大,無需進行下面的命令操作,否則則進行下面的程序
        tmp = nums[maxindex]                 #將列表中最大的值賦給另一個參數
        nums[maxindex]=nums[i]               #將列表中maxindex索引的值刷新為i索引的值
        nums[i]=tmp                          #將列表中i的索引的值刷新為tmp的最大值


print(nums)

輸出結果為:

技術分享

回顧之前所學知識,並以新的所學知識做一些以前的習題:

求楊輝三角的第5列的第4個值

m=5
k=4
traingle=[]

for i in range(m):
    row=[1]
    traingle.append(row)
   
    for j in range(1,i):
         if i == 0:
            continue
        row.append(traingle[i-1][j-1]+traingle[i-1][j])
    row.append(1)
traingle.append(row)

print(traingle)
print(traingle[m-1][k-1])

技術分享

習題二:

技術分享

lst=[[1,2,3],[4,5,6],[7,8,9]]
for i in range(len(lst)):             #依次循環3個列表
    for j in range(i):                  #本次循環的是列表中的索引值

        lst[i][j],lst[j][i]=lst[j][i],lst[i][j]     #將列表的值進行交換
print(lst)                   

for k in lst:                     #重新排序
    print(k)                  

輸出結果為:

技術分享

習題3:

技術分享

firstlist=[[1,2,3],[4,5,6]] #創建一個包含兩列數的列表
secondlist=[]               #創建一個空列表
m=len(firstlist)            #將第一個列表的長度輸出給m
for i in range(m+1):          #
    secondlist.append([0]*m)#循環三次,並開辟3個介為0的子列表
print(secondlist)
print(firstlist)
for i in range(m):          #   
    for j in range(m+1):    #利用兩層循環來讀取索引上的數值
        secondlist[j][i]=firstlist[i][j]    # 將對應索引上的值進行交換
print(secondlist)

輸出結果為:

技術分享

習題三:

隨機生成10個數字; 每個數字的取值範圍不超過20 分別統計重復與不重復的數字有幾個:
import random
nums=[]
for _ in range(10):
    nums.append(random.randrange(21))

print(nums1={}.format(nums))
print()
                                        隨機生成10個20以內的數字
————————————————————————
length=len(nums)
samenums=[]
diffnums=[]
states = [0]*length

for i in range(length):
    flag=False
    if states[i]==1:
        continue
    for j in range(i+1,length):
        if states[j]==1:
            continue
        if nums[i]==nums[j]:
            flag=True
            states[j]=1
    if flag:    #有重復
        samenums.append(nums[i])
        states[i]=1
    else:
        diffnums.append(nums[i])

print("Same numbers={1},counter={0}".format(len(samenums),samenums))
print("different numbers={1},counter={0}".format(len(diffnums),diffnums))
print(list(zip(states,nums)))

python的set,和字典的詳細使用方法,以及部分習題