[英]Find all matchings of two differently sized arrays
因此,我有兩個不同的列表,說:
list1 = [a,b,c,d]
list2 = [e,f,g]
我的目標是找出這兩個列表之間的最小差異。 我有一個定義的函數d(x,y)
,它給出兩個元素x
和y
之間的差。 它們如此匹配:list1中的每個元素都匹配list2中的一個或零個元素。 不匹配的元素還具有d(a)
給出的“差異”。
我不確定執行此操作的最佳算法是什么,或者我將如何處理。 如果相關,我正在使用python。
我認為您希望在二部圖中進行匹配: http : //en.wikipedia.org/wiki/Matching_( graph_theory) #Maximum_matchings_in_bipartite_graphs您應該使用匹配算法。 如果不能,那么請使用整數編程。 Pulp是適合整數編程的python軟件包。 Integer編程包會慢很多,但可能更容易編寫代碼。
如果選擇使用整數編程,則約束條件是變量Aij表示list1 [i]和list2 [j]之間的連接。 Aij = 1或0。(連接打開或關閉)。 Sum(i上的Aij)=1。(list1中每個元素一個連接)。 Sum(j上的Aij)= 1(列表2中每個元素一個連接)。 現在您要最大化/最小化目標函數sum(d(list1 [i],list2 [j])* Aij)。 不要忘記,如果length list1!= length list2,則必須添加額外的變量,以允許某些變量以成本d(x)連接到自身,並將其添加到目標函數中。
我不太確定您要問的基本上是查找兩個列表之間共有的所有元素。
在這種情況下,這可能會起作用:
list1 = [1,2,3,4]
list2 = [3,4,5]
diff = set(list1).intersection(set(list2))
我認為這個問題有點含糊,但我的想法是:
盡管我想知道OP是否正在尋找列表或類似產品。
也許,如果OP通過itertools函數進行瀏覽,他們可能會看到一些合適的東西。
import random
list1 = random.sample(range(50), 3)
list2 = random.sample(range(50), 2)
print "List1", list1
print "List2", list2
def router(a, b):
print "ROUTER", a, b
if a == None:
return b * 10
elif b == None:
return a * 10
else:
return (a + b ) * 10
print map(router, list1, list2)
##########################
# Using itertools.product
##########################
import itertools
def pair(p):
a, b = p
print "PAIR", a, b
if a == None:
return b * 10
elif b == None:
return a * 10
else:
return (a + b ) * 10
product = itertools.product(*zip(*map(None, list1, list2)))
print map(pair, product)
輸出量
List1 [17, 48, 9]
List2 [45, 42]
ROUTER 17 45
ROUTER 48 42
ROUTER 9 None
[620, 900, 90]
PAIR 17 45
PAIR 17 42
PAIR 17 None
PAIR 48 45
PAIR 48 42
PAIR 48 None
PAIR 9 45
PAIR 9 42
PAIR 9 None
[620, 590, 170, 930, 900, 480, 540, 510, 90]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.