2015-06-12 39 views
0

我的目標是到k最小的對:查找兩個列表

  1. 對兩個列表中的元素;和
  2. 找到k最小的一對。

此刻,我可以配對的每一個元素在兩個列表下面的代碼:

import itertools 

a = [1, 3, 5, 7] 
b = [2, 4, 6, 8] 
c = list(itertools.product(a, b)) 

print c 

而且我的輸出是:

[(1, 2), (1, 4), (1, 6), (1, 8), (3, 2), (3, 4), (3, 6), (3, 8), (5, 2), (5, 4), (5, 6), (5, 8), (7, 2), (7, 4), (7, 6), (7, 8)] 

假設我設置k = 3,應該還給我三個最小的對:(1, 2)(1, 4)(3, 2)。我怎麼做?

+4

'排序(C,鍵= SUM) :k]'(ie *「通過按照每個元素的'sum'對原始列表進行排序來創建一個新列表,然後對第一個'k'元素」*)進行切片? – jonrsharpe

+0

謝謝,您的建議有效。 – Greit

+0

雖然有很多邊緣案例 - 例如,您想如何處理關係? 'sorted'是穩定的,所以tie的項目會按照它們最初出現的順序輸出,但這可能不是你想要的。 – jonrsharpe

回答

0

您可以使用heapq.nsmallestsum作爲其主要的功能:

>>> import heapq 
>>> heapq.nsmallest(3,c,key=sum) 
[(1, 2), (1, 4), (3, 2)] 

或者像@jonrsharpe在評論說,你可以使用sorted

sorted(c, key=sum)[:k] 
+1

謝謝,它也可以。 – Greit