2016-08-06 12 views
0

Umwandlung ist es eine (vorzugsweise elegant) Art und Weise in Python fürein Array von Paaren in einen 2D-Array basierend auf erster Spalte

[[3,350],[4,800],[0,150],[0,200],[4,750]] 

in so etwas wie

[ 
    [150,200], 
    [], 
    [], 
    [350], 
    [800,750] 
] 
ein Array von Paaren wie unter

?

Mit anderen Worten, was ist eine gute Methode, um die zweite Zahl in jedes Paar in ein Array zu setzen, wobei der Zeilenindex durch die erste Zahl in dem Paar bestimmt wird?

+1

Wenn die Liste, die Sie haben Löcher (wie Index 1 und 2 sind leer), dann möchten Sie vielleicht das Design zu überdenken. Vielleicht wäre ein Wörterbuch eine gute Wahl hier – thefourtheye

Antwort

0

Als @thefourtheye notiert dict könnte besser Container sein. Für den Fall, dass Sie 2D-Liste möchten, könnten Sie zuerst die Werte ein Zwischenprodukt dict hinzufügen, wobei Schlüssel Zeile und Wert eine Liste von Zahlen ist. Dann könnten Sie Liste Verständnis verwenden um das Endergebnis zu erzeugen:

>>> l = [[3,350],[4,800],[0,150],[0,200],[4,750]] 
>>> d = {} 
>>> for row, num in l: 
...  d.setdefault(row, []).append(num) 
... 
>>> [d.get(i, []) for i in range(max(d.keys()) + 1)] 
[[150, 200], [], [], [350], [800, 750]] 
0

I pandas Modul für diese Aufgabe verwenden würde:

In [186]: a = np.array([[3,350],[4,800],[0,150],[0,200],[4,750]]) 

In [187]: res = pd.DataFrame(a).groupby(0)[1].apply(list).to_frame('val').rename_axis('idx') 

In [188]: res 
Out[188]: 
      val 
idx 
0 [150, 200] 
3   [350] 
4 [800, 750] 

Jetzt haben Sie eine indizierte Datensatz und Sie können es in den folgenden verwenden übrigens:

In [190]: res.ix[0, 'val'] 
Out[190]: [150, 200] 

In [191]: res.ix[0, 'val'][1] 
Out[191]: 200 

In [192]: res.ix[4, 'val'] 
Out[192]: [800, 750] 

PS ich glaube, Sie nicht leere Listen im resultierenden Datensatz halten müssen - wie es eine Verschwendung von Ressourcen

ist
1

Versuchen Sie sich einen Überblick über die Liste zu verschaffen, sie bieten eine einfache Möglichkeit Listen zu erstellen. Wenn Sie nicht wissen, was sie sind, ist dies eine ziemlich gute Anleitung, um loszulegen here. Schauen Sie sich auch tuple an, da sie eher für gepaarte Werte als für Listen geeignet sind. Beachten Sie, dass Tupel nicht veränderbar sind. Sie können also keine Änderungen mehr vornehmen, nachdem Sie sie erstellt haben.

Ihre Liste mit Tupeln wie diese

foo = [(3,350),(4,800),(0,200),(4,750)] 

Soweit ich weiß, Python-Listen haben keine vordefinierte Größe aussehen würde, sondern sie wachsen und schrumpfen, wie Änderungen vorgenommen werden. Was Sie also tun wollen, ist, den größten Indexwert in der Liste zu finden, oder foo = [x[0] for x in list_of_pairs] würde auf den ersten Index jeder Liste innerhalb Ihrer Hauptliste zugreifen, die mit dem Namen list_of_pairs. Beachten Sie, dass diese Strategie auch für die tuple basierte Liste funktionieren würde.

unten Das sollte das tun, was Sie

list_of_pairs = [[3,350],[4,800],[0,200],[4,750]] 
indexes = {x[0] for x in list_of_pairs} 
new_list = [] 

for i in indexes: 
    new_list.append([x[1] for x in list_of_pairs if x[0] == i]) 
0

wollen, gibt es numerious Möglichkeiten, dies zu tun. Hier ist eine ziemlich unkomplizierte:

a = [[3, 350], [4, 800], [0, 150], [0, 200], [4, 750]] 

rows, values = zip(*a) 
b = [[] for _ in range(max(rows)+1)] # initialize 2D output 
for i, row in enumerate(rows): 
    b[row].append(values[i]) 

print(b) # -> [[150, 200], [], [], [350], [800, 750]] 
+0

Bitte lesen [_Was soll ich tun, wenn jemand meine Frage beantwortet? _] (Http://Stackoverflow.com/help/someone-answers) – martineau