Как разобрать только дубликаты из списка в Python? - PullRequest
0 голосов
/ 10 ноября 2018

Если у меня есть список имен генов, например, и я хочу создать новый список, содержащий только повторяющиеся гены, как бы я это сделал?

Пример исходного списка:

RGN
RBM10
ARAF
ZNF630
FTSJ1
SLC35A2
SLC35A2
SLC35A2
MAGIX
DGKK
XAGE1B
XAGE1B
SMC1A
FAM120C
CXorf49
CXorf49B
CHIC1
ABCB7
PBDC1
FGF16
ATP7A
CYLC1
TSPAN6
BTK
BTK
TCEAL4
TEX13A
FRMPD3
PRPS1
COL4A6
COL4A6
COL4A6

Например, SLC35A2 будет в новом списке, потому что он повторяется 3 раза.

Пожалуйста, предложите.

Ответы [ 3 ]

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

collections.Counter делает это быстро и тривиально:

from collections import Counter

# Using other answer's listOfGenes for convenience
listOfGenes = "RGN RBM10 ARAF ZNF630 FTSJ1 SLC35A2 SLC35A2 SLC35A2 MAGIX DGKK XAGE1B XAGE1B SMC1A FAM120C CXorf49 CXorf49B CHIC1 ABCB7 PBDC1 FGF16 ATP7A CYLC1 TSPAN6 BTK BTK TCEAL4 TEX13A FRMPD3 PRPS1 COL4A6 COL4A6 COL4A6".split()

# Actual work is a one-liner; count them all, keep those with count of 2 or more
duplicates = [gene for gene, cnt in Counter(listOfGenes).items() if cnt >= 2]

В CPython 3.6 и более поздних версиях (и во всех интерпретаторах Python, когда они достигают 3.7) обеспечивается порядок вставки dict с, duplicates list будет упорядочено в порядке первого появления в listOfGenes; на 3.5 и ранее, он будет иметь произвольный порядок.

0 голосов
/ 10 ноября 2018
  • Сложность времени = O(n)
  • Сложность пространства = O(n)
  • Код:

    def get_duplicates(array):
        seen = set([])
        results = set([])
        for element in array:
            if element in seen:
                results.add(element)
            else:
                seen.add(element)
    
        return list(results)
    
    input_array = "RGN RBM10 ARAF ZNF630 FTSJ1 SLC35A2 SLC35A2 SLC35A2 MAGIX DGKK XAGE1B XAGE1B SMC1A FAM120C CXorf49 CXorf49B CHIC1 ABCB7 PBDC1 FGF16 ATP7A CYLC1 TSPAN6 BTK BTK TCEAL4 TEX13A FRMPD3 PRPS1 COL4A6 COL4A6 COL4A6"
    input_array = input_array.split()
    duplicates = get_duplicates(input_array)
    print(duplicates)
    
  • Выход:
    ['COL4A6', 'SLC35A2', 'XAGE1B', 'BTK']

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

Вы можете сделать это так:

listOfGenes = "RGN RBM10 ARAF ZNF630 FTSJ1 SLC35A2 SLC35A2 SLC35A2 MAGIX DGKK XAGE1B XAGE1B SMC1A FAM120C CXorf49 CXorf49B CHIC1 ABCB7 PBDC1 FGF16 ATP7A CYLC1 TSPAN6 BTK BTK TCEAL4 TEX13A FRMPD3 PRPS1 COL4A6 COL4A6 COL4A6".split(" ")

genesOccurences = {}
for gene in listOfGenes:
    occurence = genesOccurences.get(gene, 0)
    genesOccurences[gene] = occurence + 1

print(genesOccurences) # will print a dictionary with every gene and how often it is occurring

filteredGeneList = [ key for key in genesOccurences if genesOccurences[key] > 1 ]
print(filteredGeneList) # will print only those genes occurring > 1 times.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...