Как пересечь два горизонтальных списка с помощью Python? - PullRequest
1 голос
/ 15 мая 2011

В коде, который я пишу, мне нужно пересечь два горизонтальных списка, например:

lišta:

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

Я также могу создавать списки по две строки в строке, например: \

lišta:

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

LISTB

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

Важным вопросом в этом случае является то, что два столбца должны рассматриваться как один

спасибо за ваше время!

Ответы [ 5 ]

5 голосов
/ 15 мая 2011

Преобразовать в наборы и пересечь: set(a) & set(b)

4 голосов
/ 15 мая 2011

Использовать Python комплекты

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)
2 голосов
/ 15 мая 2011

Использовать установленное пересечение.

setC = set(listA) & set(listB)
listC = list(setC) # if you really need a list
1 голос
/ 15 мая 2011

импорт numpy как np

np.intersect_nu(list1, list2)
0 голосов
/ 15 мая 2011

Возможно, существует оптимизация производительности, при которой не создаются 2 набора из списков, что требует хеширования всех элементов в списке, но создает только 1 набор и выполняет итерацию по второму списку. Если вы знаете, какой список большой, а какой маленький, это также может помочь.

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

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

    return intersection
...