簡體   English   中英

如何在python中排序所有組合?

[英]How to sort all combinations in python?

我有K=2N=3並生成所有組合,如下所示:

list(itertools.product(range(1, N+1), repeat=K))

我得到

[(1, 1), 
 (1, 2),
 (1, 3), 
 (2, 1), 
 (2, 2), 
 (2, 3), 
 (3, 1), 
 (3, 2), 
 (3, 3)]

我需要對這些組合進行排序以獲得

[(1, 1), 
 (2, 2),
 (3, 3),
 (1, 2),
 (1, 3), 
 (2, 1), 
 (2, 3), 
 (3, 1), 
 (3, 2)]

對於一般的KN我該怎么做?

就像有N垃圾箱和K物料,我想將所有可能的物料分配給垃圾箱,但從

  • 所有分配給料倉1,然后分配到料倉2的項目,依此類推。
  • 將K-1項分配給垃圾箱1,將一項分配給垃圾箱2,依此類推。
  • ...

因此,在示例中, (1, 1)表示所有項目都在箱1中, (2, 2)表示所有項目都在箱2中,以此類推。 (1, 2)表示項目1在箱1中,而項目2在垃圾箱2中,依此類推。

它已經生成了幾乎您想要的方式,因此您可以利用python的穩定排序優勢:

>>> L = list(itertools.product(range(1, N+1), repeat=K))
>>> L.sort(key=lambda t: len(set(t)))
>>> L
[(1, 1), (2, 2), (3, 3), (1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]

這只是將具有最相等值的元組推到前面。 應該將其推廣到與您描述的方式一致的更高維度。

您可以簡單地做到這一點:

import itertools
K = 2
N = 3
a = list(itertools.product(range(1, N+1), repeat=K))
a_sorted = sorted(a, key=lambda t: -(t[0] == t[1]))

lambda函數告訴sorted將等號的元組放在開頭。 我們還需要對數字值進行排序,但是由於這是sorted的默認行為,因此我們無需手動添加。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM