2017-12-17 10 views
0

Also ich möchte eine Eingabedatei mit 3 Zeilen aufnehmen. Erste Zeile, ist die Anzahl der Elemente in der Liste Zweite Zeile, die Indizes, wie ich die Liste neu anordnen möchte. (siehe unten für weitere Informationen) Dritte Zeile, die Liste der Zahlen selbstPython: Sortiere eine Liste nach vordefiniertem Index

So von der zweiten Zeile in der in.txt sind die Indizes für die neu angeordnete Liste. Schwer zu erklären, aber das ist, wie es funktionieren würde (siehe in.txt als Referenz) Die erste Nummer bleibt die gleiche, die zweite Nummer wird die dritte, die fünfte Nummer wird die zweite, die vierte wird die fünfte, etc.

Hier einige Beispiel-Eingang: in.txt

5 
1 3 4 5 2 
12 33 96 84 74 

output.txt

12 
74 
33 
96 
84 

Hier ist das Programm selbst:

nur für einige Hintergrundinformationen, die Zahlen in der Liste gehen etwas wie jetzt

das Problem Produkt-ID sein, ist, dass ich Elemente zweimal neu anordnen.

Sorry, wenn ich bin ein wenig unklar (lol und für die seltsamen Variablennamen)

Antwort

2

Sobald Sie Ihre Dateien in Listen lesen können Sie den folgenden Code verwenden, sie zu sortieren:

>>> indexes = [1, 3, 4, 5, 2] 
>>> values = [12, 33, 96, 84, 74] 
>>> newlist = [0, 0, 0, 0, 0] 
... 
... 
>>> for x, y in zip(indexes, values): 
...  newlist[x-1] = y 
... 
>>> for x in newlist: 
...  print(x) 
... 
12 
74 
33 
96 
84 
+0

Ich bekomme einen nicht unterstützten Operandentyp Fehler für -: 'str' und 'int' in dieser Zeile '_newlist [x-1] = y' –

+0

hat es mit 'list (map (int, values)) ' –

2

Sie können dies versuchen:

file_data = [map(int, i.strip('\n').split()) for i in open('filename.txt')] 
new_data = [i[-1] for i in sorted(zip(file_data[1], file_data[-1]), key=lambda x:x[0])] 

Ausgang:

[12, 74, 33, 96, 84] 
+0

Du bist ziemlich der Stripper ... macht es vor n wenn du nicht musst :-) –

1

Unter der Annahme, dass Sie bereits extrahieren, die Listen der Positionen und die Liste des Produkt-IDs verwaltet (Sie müssen noch Daten auf ganze Zahlen konvertieren):

positions = [1, 3, 4, 5, 2] 
product_ids = [12, 33, 96, 84, 74] 

Sie Produkt-IDs von bestimmten Positionen mit einem Muster sortieren decorate-sort-undecorate genannt:

>>> [prod_id for (pos, prod_id) in sorted(zip(positions, product_ids))] 
[12, 74, 33, 96, 84] 

Schritt für Schritt erklärt:

W e erste dekorieren die Liste der Produkt-IDs mit ihren entsprechenden Positionen:

>>> zip(positions, product_ids) 
[(1, 12), (3, 33), (4, 96), (5, 84), (2, 74)] 

Wir dann Art der eingerichteten Liste - das uns geben eine richtige Reihenfolge, da Tupel positionsweise sortiert werden, und da die erster Gegenstand ist eine Position, das gibt uns die Reihenfolge, die wir wollen.

>>> sorted(zip(positions, product_ids)) 
[(1, 12), (2, 74), (3, 33), (4, 96), (5, 84)] 

Schließlich haben wir undecorate (auspacken) die jetzt sortierten Liste von Tupeln eine Liste der Produkt-IDs in gewünschter Reihenfolge zu erhalten (während ihre Position info verwerfen):

>>> [prod_id for (pos, prod_id) in sorted(zip(positions, product_ids))] 
[12, 74, 33, 96, 84] 

(verwendet Python 2 für die Demo)

Verwandte Themen