2011-05-14 42 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