2013-05-03 85 views
0

我有兩個列表,它們基本上需要根據它們的匹配項目(列表)相互映射。輸出是已映射的對的列表。當要映射的列表長度爲一時,我們可以在另一個列表中查找直接匹配。問題出現,當被映射列表的長度爲> 1,我需要找到,如果在一個列表是B.在Python中將兩個列表根據其項目映射到列表對中

的一個子集

輸入:

A = [['point'], ['point', 'floating']] 
B = [['floating', 'undefined', 'point'], ['point']] 

我的失敗代碼:

C = [] 
for a in A: 
    for b in B: 
     if a == b: 
      C.append([a, b]) 
     else: 
      if set(a).intersection(b): 
       C.append([a, b]) 

print C 

預期輸出:

C = [ 
    [['point'], ['point']], 
    [['point', 'floating'], ['floating', 'undefined', 'point']] 
    ] 
+0

爲什麼'[['point','floating'],['point']]'不在預期的輸出中? – 2013-05-03 19:52:08

+0

@ashwini請參閱上面的說明。我已經解釋了Y. – Shankar 2013-05-03 19:56:35

+0

「長度> 2」(您現在更新了)正在竊聽我,請參閱下面的解決方案。 – 2013-05-03 20:09:55

回答

1

只需添加一個長度條件爲elif聲明:

import pprint 
A = [['point'], ['point', 'floating']] 
B = [['floating', 'undefined', 'point'], ['point']] 
C = [] 

for a in A: 
    for b in B: 
     if a==b: 
      C.append([a,b]) 
     elif all (len(x)>=2 for x in [a,b]) and not set(a).isdisjoint(b): 
      C.append([a,b]) 

pprint.pprint(C) 

輸出:

[[['point'], ['point']], 
[['point', 'floating'], ['floating', 'undefined', 'point']]] 
1

只是爲了利益的緣故,這裏的 「一條線」 的實施使用itertools.ifilter

from itertools import ifilter 

C = list(ifilter(
    lambda x: x[0] == x[1] if len(x[0]) == 1 else set(x[0]).issubset(x[1]), 
    ([a,b] for a in A for b in B) 
)) 

編輯:

有閱讀問題的最新評論,我想我可能誤解究竟被認爲是匹配的。在這種情況下,這樣的事情可能會更合適。

C = list(ifilter(
    lambda x: x[0] == x[1] if len(x[0])<2 or len(x[1])<2 else set(x[0]).intersection(x[1]), 
    ([a,b] for a in A for b in B) 
)) 

無論哪種方式,基本概念是相同的。只需改變lamba中的條件,就可以完全匹配你想要匹配的東西。

相關問題