2011-05-14 40 views
1

在代碼我寫我需要交兩名橫列表,如:如何使用python相交兩個水平列表?

listA的:

chr1 aatt 
chr8 tagg 
chr11 aaaa 
chr7 gtag 

數組listB

chr8 tagt 
chr1 tttt 
chr7 gtag 
chr11 aaaa 
chr9 atat 

#This lists are compounded by one str per line, wich it has a "/t" in the middle. 
#Also note that are in different order 

我怎樣才能得到這兩個列表之間的交集?

期望的結果:

chr7 gtag 
chr11 aaaa 

我也可以產生每線兩條串的名單,像這樣:\

listA的:

('chr1', 'aatt') 
('chr8', 'tagg') 
('chr11', 'aaaa') 
('chr7', 'gtag') 

數組listB

('chr8', 'tagt') 
('chr1', 'tttt') 
('chr7', 'gtag') 
('chr11','aaaa') 
('chr9', 'atat') 

在這種情況下的重要事項是,兩列必須被視爲一個

感謝您的時間!

回答

4

使用Python sets

listA = (
    ('chr1', 'aatt'), 
    ('chr8', 'tagg'), 
    ('chr11', 'aaaa'), 
    ('chr7', 'gtag'), 
) 

listB = (
    ('chr8', 'tagt'), 
    ('chr1', 'tttt'), 
    ('chr7', 'gtag'), 
    ('chr11','aaaa'), 
    ('chr9', 'atat'), 
) 

combined = set(listA).intersection(set(listB)) 
for c, d in combined: 
    print c, d 

您還可以使用&這樣的:

combined = set(listA) & set(listB) 
5

轉換爲集和相交:set(a) & set(b)

2

使用交集。

setC = set(listA) & set(listB) 
listC = list(setC) # if you really need a list 
+2

您是否看到上述兩個相同的答案? – bluepnume 2011-05-14 23:33:51

+0

從技術上講,這個答案是三個中最正確的,因爲它返回一個列表。 – mseery 2011-05-14 23:49:00

+0

嗯,不服氣,他們要求一個十字路口,而不是一個清單。再加上一套在這種情況下顯然是最合適的回報價值。 – bluepnume 2011-05-14 23:54:16

1

進口numpy的爲NP

np.intersect_nu(list1, list2) 
0

或許有通過不從名單建立2套,這需要哈希列表中的所有項目,但創建僅1套,並通過迭代一個性能優化第二個列表。如果你知道哪個列表很大,哪些很小,那也可以提供幫助。

def intersect(smallList, largeList): 
    values = set(smallList) 
    intersection = [] 

    for v in largeList: 
     if v in values: 
      intersection.append(v) 

    return intersection