簡體   English   中英

查找兩個大小不同的數組的所有匹配項

[英]Find all matchings of two differently sized arrays

因此,我有兩個不同的列表,說:

list1 = [a,b,c,d] 
list2 = [e,f,g] 

我的目標是找出這兩個列表之間的最小差異。 我有一個定義的函數d(x,y) ,它給出兩個元素xy之間的差。 它們如此匹配: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.

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