Python使用combinations實現排列組合
Python使用combinations實現排列組合
好久沒有寫部落格了!昨天小牛在上海舉辦了牛友見面會,現場優惠還是比較大,心儀已久加上一時腦熱就入手了。以為會有多麼開心,其實目前最大的感受就是焦慮!擔心電動車被偷,擔心電池被偷,擔心路上突然被交警叔叔攔下!我想,直到我的小牛真的被偷的那天,這種焦慮才會隨之消失。唉,要說這樣的焦慮怎麼來的,我只能呵呵了:)
下面步入正題:
今天在幫我們家王博處理專利資料的時候,需要對專利資料中的城市和專利主體的合作關係數量進行統計。一項專利其寫作主體可能由兩個或兩個以上主體參與,各個主體又分屬不同或者相同的城市,對其合作關係數量進行統計,其實就是對主體及城市進行排列組合。Python
的itertools
庫中提供了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
的基礎知識太欠缺了!搞得我都不好意思把這篇部落格發出來了(捂臉)
相關文章
- 排列組合
- 遞迴演算法實踐---實現排列組合遞迴演算法
- 【數學】組合數學 - 排列組合
- 組合數學筆記-排列與組合筆記
- 字串排列組合問題字串
- 字母排列(python實現)Python
- python實現高效率的排列組合演算法Python演算法
- 【原創】開源.NET排列組合元件KwCombinatorics使用(一)—組合生成元件
- 回溯問題Python框架總結——排列組合問題Python框架
- js運算元組中資料排列組合JS
- 無重複字串的排列組合字串
- python:用pyinstaller做個排列組合的小工具Python
- 增補部落格 第十六篇 python 排列組合序列Python
- Java實現全排列、組合演算法Java演算法
- 【POJ 2249】 Binomial Showdown 組合數學 排列組合計算
- Relax! It's just a game(排列組合,簡單)GAM
- 使用 Python 組合 NBA 球星卡Python
- acm-排列組合學習筆記(更新中)ACM筆記
- Java實現-全排列Java
- 程式設計師必備演算法——排列組合程式設計師演算法
- Redux實現組合計數器Redux
- 如何實現條件組合元件元件
- PHP使用動態規劃實現最優紅包組合PHP動態規劃
- CF1796C C. Maximum Set 題解 排列組合
- 字串全排列 java實現字串Java
- 遞迴示例-指定數字以內的所有排列組合(Reduce)遞迴
- [LeetCode] Letter Combinations of a Phone Number 電話號碼的字母組合LeetCode
- 使用C# (.NET Core) 實現組合設計模式 (Composite Pattern)C#設計模式
- Spring:如何實現註解的組合Spring
- Python引數組合Python
- Python量化交易進階講堂-Markowitz模型實現最優投資組合Python模型
- 遊戲創新的一般方法論,本質就是排列組合?遊戲
- 生成{1,2,...,n}的排列的演算法-組合數學演算法
- 【R語言學習筆記】探索ggplot的排列組合(一)R語言筆記
- 筆試小技巧--隔板法解排列組合問題(附程式碼)筆試
- CSS3實現文字垂直排列CSSS3
- 實現自然數N的全排列
- VUE Cookbook 系列:實現可配置組合表單Vue