2016-05-06 24 views
0

Ich arbeite an einem Projekt, in dem ich eine Liste von Listen mit Datenpunkten (Klonen) und IDs in eine andere Liste sortieren möchte. Um es klar zu sagen, das gewünschte Format ist Cluster [ID, Daten []]. Die Daten sind eine Liste mit 8 Datenpunkten. Das Format, in dem ich jetzt die Listen habe, ist clusterData [clusterId, ...] und eine Liste von IDs und Clustern wie clusterResultData [cloneId, clusterId].Eine Liste in eine andere Liste sortieren

Der Sortierprozess durchgeführt wird, wie folgt:

for i in range(len(clusterResultData)): 
    clusterId = int(clusterResultData[i][1]) 
    clusters[clusterId].append(clusterData[i]) 

Die Ausgabe Dies ist eine Liste mit Format Cluster [ClusterID, data [CloneID, ...]. Jeder der "Cluster" ist jedoch mit ALLEN ~ 1000 Datenpunkten gefüllt, während die Punkte über die Cluster verteilt sein sollten.

Wenn es hilft, hier ist der vollständige Code:

clusterResultData = [] 
clusterData = [] 
clusterIdList = [] 


with open("Voorbeeld_clusterresult.txt", "r") as resultFile: 
    i = 0 
    for line in resultFile: #doorloopt alle regels in het bestand 
     if len(line) != 0: 
      clusterResultData.append(line.split()) #maakt een list met [cloneId, clusterId] voor elke clone 
      clusterIdList.append(clusterResultData[i][1]) 
     i += 1 
    amOfClusters = len(set(clusterIdList)) #aantal unieke clusterIds 
    clusters = amOfClusters * [['']] 
with open("Voorbeeld_clusterdata.txt", "r") as resultFile: 
    i = 0 
    for line in resultFile: 
     if len(line) != 0: 
      clusterData.append(line.split()) #maakt een list met [cloneId, clusterId] voor elke clone 
      #print clusterData[i], clusterResultData[i] 
     i += 1 
for i in range(len(clusterResultData)): 
    clusterId = int(clusterResultData[i][1]) 
    clusters[clusterId].append(clusterData[i]) 

for i in range(amOfClusters): 
    print i, clusters[i][1] #test, every cluster is exactly identical 

und diese sind die Strukturen der beiden txt-Dateien mit Daten:

Voorbeeld_clusterdata.txt:

846160 0.388 0.329 0.69 0.9 0.626 0.621 0.399 0.37 
820434 -0.296 -0.503 -0.454 -0.868 -0.721 -0.918 -0.486 -0.582 
849103 -0.246 -0.935 -0.277 -0.175 -0.278 -0.075 -0.236 -0.417 
... 

Voorbeeld_clusterresult .txt:

846160 1 
820434 5 
849103 4 
... 

Antwort

0

Das Problem ist auf der Linie, wo Sie clusters erzeugen:

clusters = amOfClusters * [['']] 

Dadurch wird eine Liste erstellen, die amOfClusters Hinweise auf die gleichen sublist hat. Wenn Sie ein Element in eine Unterliste in einem Index hinzufügen, sehen Sie die Änderung überall:

>>> clusters = [['']] * 4 
>>> clusters 
[[''], [''], [''], ['']] 
>>> clusters[0].append('x') 
>>> clusters 
[['', 'x'], ['', 'x'], ['', 'x'], ['', 'x']] 

Um dieses Problem zu beheben Sie eine neue Liste für jeden Index erstellen müssen. Sie können mit list comprehension so leicht tun:

>>> clusters = [[''] for _ in range(4)] 
>>> clusters[0].append('x') 
>>> clusters 
[['', 'x'], [''], [''], ['']] 

Wenn Sie die Zeile Code ändern folgende Sie das erwartete Verhalten bekommen sollte:

clusters = [[''] for _ in range(amOfClusters)] 
+0

Du bist ein Held! Danke für die extrem schnelle Antwort :) – bdec

Verwandte Themen