2017-07-28 4 views
2

Ich versuche, eine Liste der Top k Elemente einer großen Reihe von Tupeln zu halten. Da es unmöglich ist, sie im Speicher zu behalten, möchte ich eine Liste fester Größe verwenden, um nur die oberen k-Werte (mit den Schlüsseln) zu behalten. Ich habe versucht, Min-Heap zu verwenden, aber Pythons Heap ist schrecklich, da nicht-eindeutige Schlüssel eingefügt werden können. Das ist ein großes Problem. Also dachte ich, ich könnte stattdessen eine sortierte Liste/dict verwenden (Tupel mit eindeutigen Schlüsseln). Unter Verwendung der Skizzenfunktion erhalte ich die Anzahl der Zählungen, die der Teilstring im gesamten Text (O (1) -Zeit) aufgetreten ist). Ich fange an zu denken, dass ich etwas falsch mache mit den Loops oder Pops und Zuweisungen, weil das Minheap auch ein ähnliches Problem hat, wo nur das Top k in der 25er Liste angezeigt wird, und der Rest ist ziemlich niedrig (wenn es in ist) Tatsache höher)Running top k Elemente in einer sortierten, festen Größe Liste/Python

for line in lines[1::4]: 

    startIdx = 0 
    while startIdx + k <= (len(line)-k): 
     kmer = line[startIdx:(startIdx+k)] 
     count = randint(1, 250) 

     if count > 2: 
      if len(tdict.keys()) < topcount: 
       tdict[km] = count 
      else: 
       kMin = (sorted(tdict,reverse = False, key=lambda x: x[1])) 
       if count > tdict[kMin[0]]: 
        topkmerdict.pop(kMin[0]) 
        topkmerdict[km] = count 
     startIdx += 1 

    linesProcessed += 1 
+0

Es ist schwer, Ihr Problem zu lösen, weil es nicht ganz klar ist. Ihr Code bezieht sich auf die Variablen 'sketch' und' topkmerdict', die sich außerhalb des Codes befinden. Bitte lesen Sie nach, wenn Sie ein [mcve] schreiben und bearbeiten Sie die Frage entsprechend. Die entsprechenden Eingaben und die erwarteten und tatsächlichen Ausgaben würden Ihnen und allen anderen helfen, Ihr Problem zu beheben. Ich weiß, dass du gesagt hast, dass du mehr liest, als du im Gedächtnis behalten kannst, aber du solltest in der Lage sein, den Algorithmus mit einem kleineren Datensatz zu testen. Übergeben Sie diesen minimalen Datensatz mit erwarteten Ausgaben an uns, und dann können wir Ihnen helfen, Ihr Problem zu beheben. –

+0

@ScottMermelstein Danke, ich habe bearbeitet, um eine Beispieldatei hinzufügen, Datei lesen Teile des Codes und die Funktion geändert, um eine Zufallszahl, die Funktionalität ähnelt ähnlich (gibt zurückzahlen in int). – dusa

+0

hast du heapq angeschaut, es könnte alles tun, was du brauchst? – paddyg

Antwort

1

Bitte versuchen Sie es die Zeile zu ändern:

kmerMin = (sorted(topkmerdict,reverse = False, key=lambda x: x[1])) 

zu:

kmerMin = (sorted(topkmerdict,reverse = False) 

die vorhergehende Zeile nur Schlüssel v an das zweite Zeichen des Strings Sortier alues.

Verwandte Themen