Python學習筆記(1)——數組差集

來源:互聯網
上載者:User

標籤:

       面試的時候被問到這樣一個問題:有A、B兩個數組,找出B中有A中沒有的所有元素(換言之即是求差集B-A)。當時比較緊張,用了最原始的雙重嵌套迴圈逐個比較,很顯然這種時間複雜度高達O(n2)的演算法相當low。

       回去之後經過思考,有了一個新的思路,即先對A、B進行排序,時間複雜度為O(nlog2n),再對排序後的數組同時遍曆進行比較,這裡的時間複雜度為O(n),這樣總體的時間複雜度為O(nlog2n),效率比之前有了改進。(PS:在網上搜尋過之後,發現還有hash的方法可以更簡單,這裡暫不詳敘。)

       於是用剛學不久的Python來編寫代碼實現新的思路:

 1 a=[1,2,3,4,5,7,9,11,19,17] 2 b=[1,2,4,5,6,8,10,12,14,22,16,15] 3  4 a.sort() 5 b.sort() 6 print "sorted a=",a 7 print "sorted b=",b 8  9 i=0,j=010 print ("The numbers which are in list b but not in list a include:")11 while i<len(a) and j<len(b):12     if a[i]==b[j] :13         i=i+114         j=j+115     elif a[i]>b[j] :16         c.append(b[j])17         j=j+118     elif a[i]<b[j] :19         i=i+120 while j<len(b):21     c.append(b[j])22     j=j+123 print(c)
View Code

       輸出的結果為:

       sorted a= [1, 2, 3, 4, 5, 7, 9, 11, 17, 19]
       sorted b= [1, 2, 4, 5, 6, 8, 10, 12, 14, 15, 16, 22]
       The numbers which are in list b but not in list a include:
       [6, 8, 10, 12, 14, 15, 16, 22]

       與預期的結果一致。

  PS:這裡的代碼有一點小問題,因為之前用Python3,後來改成了Python2.7,在後者中,print的內容不需要括弧,而代碼中多餘的括弧並沒有完全移除,這裡因為每一句print的內容只有一個,所以輸出結果不會有差別,但是如果同一句print要輸出多個元素,就會出現不同的情況。舉個例子:

  print "a","b"

  print ("a","b")

  這樣的兩行代碼,在Python3中,前一句會報錯,後一句會輸出:a  b 。

  而在Python2.7中,前一句會輸出:a b,後一句會輸出:(‘a‘,‘b‘)。

       學習了一段時間Python後,發現了set()這個資料結構。在Python中,set()是一種無序不重複的資料結構,並且可以直接進行求交集、並集、差集的步驟。於是,上述問題可以直接這樣寫:

 1 import copy 2  3 a=[1,2,3,4,5,7,9,11,19,17] 4 b=[1,2,4,5,6,8,10,12,14,22,16,15] 5  6 A=copy.copy(a) 7 B=copy.copy(b) 8  9 print "A=",A10 print "B=",B11 print "Another way to solve it : "12 print list(set(B)-set(A))
View Code

       輸出的結果為:

  Another way to solve it :
  [6, 8, 10, 12, 14, 15, 16, 22]

  結果也是正確的。

  思路很簡單,把list先轉變成set,求差集之後再轉回list即可。注意這裡用了Python的copy這個庫,因為這段代碼和前面的方法實際上是寫在同一個程式中,如果直接用A=a,B=b的話,A和B的內容將是排序後的a和b。理由是A=a的寫法只是讓A指向a的引用地址,a改變的時候,A也會隨之改變;用copy.copy()的話,A才能記錄原始的數組a。

       用set()的方法只需要一行代碼,相當簡潔,但是這裡存在另外一個問題:假如數組b中存在著若干個重複的元素,且這些元素不存在於數組a中,而要求的結果恰好需要重複的元素也一併列出,並且不能改變元素在數組b中出現的順序。比如a=[1,5,2],b=[2,4,3,3],按照要求需要輸出[4,3,3],然而由於set()是不重複的資料結構,如果採取上述方法會自動排序和自動剔除重複的元素,輸出為[3,4],和要求不符合,那麼只能尋找其他的方法了。

  之後在operator庫中找到了方法,代碼如下:

1 import operator2 a=[1,5,2]3 b=[2,4,3,3]4 5 print "Without changing the order :"6 for num in b:7     if operator.contains(a,num)==False:8         print num,
View Code

  輸出的結果為:

  Without changing the order:

  4,3,3

  這樣即使重複出現在數組b中的元素3也能在結果中同樣重複出現,元素順序也沒有更改。operator.contains(a,num)語句的作用是判斷num是否在a中,在的話為True,否則為False。

  最後查看了一下operator的源碼,發現operator.contains(list,num)函數的定義僅僅是判斷num in list or not,於是得到了不使用庫的版本:

1 a=[1,5,2]2 b=[2,4,3,3]3 print "With no modules:"4 for num in b:5     if num not in a:6         print num,
View Code

  輸出的結果為:

  With no modules:

  4,3,3

 

Python學習筆記(1)——數組差集

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.