技術(shù)員聯(lián)盟提供win764位系統(tǒng)下載,win10,win7,xp,裝機純凈版,64位旗艦版,綠色軟件,免費軟件下載基地!

當前位置:主頁 > 教程 > 服務(wù)器類 >

如何用itertools解決無序排列組合

來源:技術(shù)員聯(lián)盟┆發(fā)布時間:2017-10-05 12:00┆點擊:

  最近我作為Python菜鳥一枚開始征戰(zhàn)Codewars,所以打算在這里記下遇到的有意思的題目。今天這第一題叫做“Best Travel”:

  John和Mary計劃去一些小鎮(zhèn)旅行。Mary已經(jīng)列好了這些小鎮(zhèn)之間的距離比如ls=[50, 55, 57, 58, 60]。但是John不想開車太累,所以提出了兩個要求:1) 開車不超過某個距離比如t=174 miles 2) 只能去3個小鎮(zhèn)。

  選擇哪3個小鎮(zhèn)可以讓John和Mary都滿意呢?(即找到距離之和最接近或等于t的3個小鎮(zhèn))

  這道題目可以抽象成:

  輸入一個整數(shù)列表ls和整數(shù)t:

  1. 找出從ls中任取三個元素的所有組合

  2. 計算每個組合的三個元素之和

  3. 如果存在小于或等于t的和,那么從中挑出最大的,然后輸出這個最大和對應(yīng)的三元素組合

  4. 如果不存在,只好返回None

  實現(xiàn)要點:

  1. 無序排列組合:

  用itertools模塊的combinations方法

  2. 求和:

  用sum函數(shù)

  3. 求最大值:

  用max函數(shù)

  4. 捕獲異常:

  用try-except

  借用這一題的某個best solution, 實現(xiàn)代碼為:

  def choose_best_sum(t, k, ls):

  import itertools

  try:

  return max(sum(combination) for combination in itertools.combinations(ls, k) if sum(combination) <= t)