Как искать, если коллекция предметов в списке? - PullRequest
0 голосов
/ 01 ноября 2018

Я перебираю файл и пытаюсь определить, найден ли определенный набор из 3 элементов (из файла) вместе в пустом списке, который я создал; если нет, я хотел бы добавить их. Если они уже появляются, я хотел бы пропустить их.

Однако, когда я запускаю следующий код:

from pprint import pprint as pp

targets = open(file)

longest_UTR = []

counter = 0

for line in targets:

    (chromosome, locus, mir, gene, transcript, UTR_length) = line.strip("\n").split("\t")

    if [locus, mir, gene] not in longest_UTR:

        longest_UTR.append([locus, mir, gene, transcript, UTR_length])

    counter += 1

    if counter == 100:

        break

pp (longest_UTR)

Я обнаружил, что вывод содержит дубликаты, то есть он не пропустил группу элементов, даже если они появляются в пустом списке (как показано стрелками ниже).

['CFI', 'hsa-miR-576-5p', 'DIS3', 'ENST00000490646', '2934'],
['APOE', 'hsa-miR-642a-5p', 'WDR64', 'ENST00000425826', '2122'],
>['C2/CFB/SKIV2L', 'hsa-miR-219a-1-3p', 'GLG1', 'ENST00000422840', '4748'],
['C2/CFB/SKIV2L', 'hsa-miR-219a-1-3p', 'GLG1', 'ENST00000422840', '4748']<,
['APOE', 'hsa-miR-330-3p', 'DCAF4L1', 'ENST00000333141', '4764'],
['TMEM97/VTN', 'hsa-miR-144-3p', 'DCAF4L1', 'ENST00000333141', '4764']]

Я хотел бы получить некоторые указания относительно того, почему это может иметь место. Спасибо.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Списки не могут быть хешируемыми, поэтому сравнение равенства между ними невозможно сделать так, как вы думаете. Сравнение списка может быть выполнено с использованием sets .

из pprint import pprint as pp

targets = open(file)

longest_UTR = []

for line in targets:
    chromosome, locus, mir, gene, transcript, UTR_length = line.strip("\n").split("\t")

    if not [set([locus, mir, gene]) < set(utr) for utr in longest_UTR]:
        longest_UTR.append([locus, mir, gene, transcript, UTR_length)])
pp (longest_UTR)
0 голосов
/ 01 ноября 2018

Похоже, longest_UTR будет список списков. И оператор if if [locus, mir, gene] not in longest_UTR будет искать список [locus, mir, gene] в longest_UTR и никогда не найдет его, так как все подсписки в longest_UTR имеют длину 5.

Скорее, вы можете просто искать первые 3 элемента каждого подсписка:

if not any(x[:3] == [locus, mir, gene] for x in longest_UTR):

Вы должны знать, что здесь важен порядок элементов. Например, если longest_UTR имеет некоторый список с первыми 3 элементами как [mir, locus, gene], оператор if вернет False.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...