Python使用combinations實現排列組合

肖老闆發表於2017-07-30

Python使用combinations實現排列組合

    好久沒有寫部落格了!昨天小牛在上海舉辦了牛友見面會,現場優惠還是比較大,心儀已久加上一時腦熱就入手了。以為會有多麼開心,其實目前最大的感受就是焦慮!擔心電動車被偷,擔心電池被偷,擔心路上突然被交警叔叔攔下!我想,直到我的小牛真的被偷的那天,這種焦慮才會隨之消失。唉,要說這樣的焦慮怎麼來的,我只能呵呵了:)
    下面步入正題:
    今天在幫我們家王博處理專利資料的時候,需要對專利資料中的城市和專利主體的合作關係數量進行統計。一項專利其寫作主體可能由兩個或兩個以上主體參與,各個主體又分屬不同或者相同的城市,對其合作關係數量進行統計,其實就是對主體及城市進行排列組合。Pythonitertools庫中提供了combinations方法可以輕鬆的實現排列組合。使用之前我先自己寫了個簡單的測試,程式碼如下:

from itertools import combinations
test_data = {'a', 'a', 'a', 'b'}
for i in combinations(test_data, 2):
    print i

    上面的程式碼執行後輸出為:

('a', 'b')

    這樣的輸出結果讓我覺得很困惑,我預期的結果是:

('a', 'a')
('a', 'a')
('a', 'b')
('a', 'a')
('a', 'b')
('a', 'b')

    同一個專利裡面的主體不會有重複的情況,但是主體所在的城市就會出現重複的情況,如果使用combinations在進行排列組合時主動忽略掉了重複的值,那我就只能自己來實現城市的排列組合了!自己實現排列組合也不難,但是這似乎不符合Python的風格。再次走讀測試程式碼,突然想到自己構造的輸入資料是不是有問題。然後改成了下面這樣:

from itertools import combinations
test_data = ['a', 'a', 'a', 'b']
for i in combinations(test_data, 2):
    print i

    將大括號換成了中括號後輸出結果與預期完全一致!這讓我相當困惑。首先是官方文件對combinations方法的介紹說的是:Elements are treated as unique based on their position, not on their value.,意思是combinations處理傳入的可迭代引數時是根據迭代元素的位置來確定是否唯一的,和元素的值是否唯一沒有關係。那使用{}[]構建的輸入資料有什麼不同呢?本來是想寫這篇部落格記錄一下問題,等高手解答或者自己日後再來查證,結果一邊寫一邊整理思路,居然被我找到原因了!
    其實很簡單:使用大括號{}建立的是集合或者字典,使用中括號[]建立的是陣列,而集合具有互異性!
    所以不管我在{}裡面寫了多少個a,其實我傳入到combinations方法裡面的引數值都只是:'a','b'。知道真相的我表示好尷尬,本來以為遇到一個多麼深奧的問題,原來只是我Python的基礎知識太欠缺了!搞得我都不好意思把這篇部落格發出來了(捂臉)

相關文章