В коде, который я пишу, мне нужно пересечь два горизонтальных списка, например:
chr1 aatt
chr8 tagg
chr11 aaaa
chr7 gtag
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
Я также могу создать списки из двух строк в строке, например:\
('chr1', 'aatt')
('chr8', 'tagg')
('chr11', 'aaaa')
('chr7', 'gtag')
('chr8', 'tagt')
('chr1', 'tttt')
('chr7', 'gtag')
('chr11','aaaa')
('chr9', 'atat')
Важным моментом в этом случае является то, что два столбца должны рассматриваться как один
спасибо за ваше время!
Использовать 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)
Преобразование в множество и пересечение: set(a) & set(b)
Используйте пересечение множества.
setC = set(listA) & set(listB)
listC = list(setC) # if you really need a list
импортировать numpy как np
np.intersect_nu(list1, list2)
Возможно, есть оптимизация производительности, не создавая 2 набора из списков, что требует хэширования всех элементов в списке, но создание только 1 набора и повторение по второму списку. Если вы знаете, какой список большой и который небольшой, что также может помочь.
def intersect(smallList, largeList):
values = set(smallList)
intersection = []
for v in largeList:
if v in values:
intersection.append(v)
return intersection