2016-11-23 10 views
2

Ich habe zwei Liste: eine ist eine ausgewählte Liste von etwa 2 Millionen Chromosomen-Positionen (z. B. [9866, 9899, ​​10257 ....]). Die andere ist eine gepaarte Liste mit Chromosomenposition und pvalue (zB [(9866, 0.001), (9899, ​​0.05)] ...)Finden Sie Elemente in einer Liste gepaarter Elemente mit einer anderen Liste (Python)

Ich möchte den p-Wert für das ausgewählte 2 Millionen Chromosom abrufen . Mein Code ist zur Zeit wie folgt:

Selection = [] 
    for i in selected indices: 
     for x in list(range(len(T3))): 
     if T3[x][0] == i: 
      b = T3[x][0],T3[x][1] 
      Selection.append(b) 

Gibt es einen schnellsten Weg, dies zu tun? Offensichtlich ist dies sehr langsam, da es für jede Zeile in T3 und für jedes Element in ausgewählten Indizes iteriert. Ich dachte, die Set-Funktion verwenden, aber meine T3-Liste ist eine Liste der gekoppelten Elemente

+1

Warum verwenden Sie Ihre erste Liste, wenn Sie die Positionen in Ihrem zweiten haben? Ich verstehe nicht, was du machen willst. Zeigen Sie Ihre erwartete Ausgabe bitte – MMF

+1

Ich habe die Position in der zweiten Liste, aber es gibt etwa 1,4 Milliarden Positionen und ich möchte nur die 2 Millionen aus der anderen Liste auswählen – CenCG

+0

Jetzt ist es klarer ... – MMF

Antwort

2

Wahrscheinlich ein schneller Ansatz wird es sein, eine Zuordnung von Position zu machen PValue:

mapping = dict(T3) 

dann diese Zuordnung verwenden:

selected_pvalues = [mapping[pos] for pos in positions] 

Hinweis: mapping werden alle doppelten Chromosomenpositionen entfernen und halten nur die letzte in der ursprünglichen Liste.

+0

T3 ist 1,4 Milliarden Einträge, sollte es schnellere Methoden als diese, wenn die "Auswahl" Operation nur einmal getan werden muss – Adirio

+0

@ juanpa.arrivillaga Danke, das hat super funktioniert! Werde daran denken, einmal abzustimmen, wenn ich genug Reputation habe. – CenCG

+0

@Adirio Nicht sicher warum, aber das war überraschend schnell in der Tat – CenCG

1

Ich bin nicht sicher, ob die erste Liste genau die gleichen Werte wie die ersten Elemente aller Paare in der zweiten enthält (ich nehme an, sie sind nicht, oder es hat keinen Sinn, sie zu haben).

Sie sollten die Paareliste in ein Wörterbuch konvertieren, und dann erhalten Sie jeden Wert in (normalerweise) O (1) Laufzeitkomplexität.

bearbeiten

Obwohl die oben sollte recht gut funktionieren, könnte Ihre speziellen Fall auch Speicherprobleme verursachen, wie Sie mit Milliarden von Datensätzen handelt. In einem Fall, in dem das Konvertieren der Liste der Paare in ein Wörterbuch zu viel Speicher beansprucht und die Gesamtleistung beeinträchtigt, können Sie einen anderen Ansatz verwenden:

Ändern Sie die erste (kleinere) Liste in einen Satz. Gehen Sie dann über die Liste der Paare und prüfen Sie für jedes Element, ob es in dieser Gruppe ist. Auf diese Weise haben Sie immer noch einen Durchlauf über die größere Struktur, aber Sie benötigen viel weniger Platz.

+0

ist möglicherweise nicht erwünscht, da er doppelte Einträge in der Liste haben möchte und weil er die Reihenfolge der Paarlisten anstelle der Reihenfolge der ausgewählten Elemente verwendet und sie können sich unterscheiden – Adirio

+0

In den Fällen, die Sie vorschlagen (welche Ich bin mir nicht sicher, ob das vom OP verlangt wird), wir können das lösen, indem wir - statt einer Menge - ein Wörterbuch verwenden, dessen Schlüssel die Position und der Wert eine (Liste von) Index (en) in der ursprünglichen Liste ist. Dadurch wird sichergestellt, dass der erforderliche Speicher in der Größenordnung kleiner ist. – Mike

0

Es wäre am besten, eine andere Kennung für die Chromosomen der zweiten Listen zu speichern. Auf diese Weise können Sie ein Wörterbuch anstelle der zweiten Liste erstellen. Zum Beispiel:

myTrillionsChromosomes = { 
    'chromosomeId': pValue, 
    ... 
} 

Edit: Das heißt, wenn Sie tatsächlich den Bau dieser Listen kontrollieren können. Eine andere Antwort beschreibt, wie man eine Liste von Tupeln in ein Dictionary umwandelt, aber angesichts der schieren Größe dieser Liste ist es vielleicht nicht sehr klug.

Dann müssen Sie lediglich den p-Wert im Wörterbuch nachschlagen, was in konstanter Zeit erfolgt.

selection = [] 
for id in identifiersList: 
    selection.append((id, myTrillionsChromosomes[id]) 
+1

Löschen von Kommentaren, da sie jetzt keine Informationen bieten, sollten Sie das gleiche tun. Downvote wurde ebenfalls entfernt. – Adirio

Verwandte Themen