2017-05-21 3 views
-1

Ich habe eine Liste, die so aussieht. [0,0,0,0,0, 'entrada', 5, 'entryb', 10, 'anotherentry', 7, 'entry', 1, 'entryd', 30, ...., 0,0, 0,0,0,0]Sortieren einer Liste mit zwei verschiedenen Typen in Python

und so weiter, ich denke, die Idee ist klar. Mein Problem ist jetzt, dass ich diese ganze Liste nach den Zahlen sortieren möchte, die der Schnur zugeordnet werden. Damit das Ergebnis so aussieht. ['entry', 1, 'entrée', 5, 'anotherentry', 7, 'entryb', 10, 'entryd', 30, .... 0, 0, 0, 0, 0] (oder umgekehrt Runde, was wäre noch besser.)

Mein Problem ist eindeutig, dass die angrenzenden Einträge zusammenhalten müssen und Wörterbücher für diese Übung nicht erlaubt sind.

Hat jemand eine Idee, wie man das macht?

Vielen Dank!

+0

Tupel aus Ihrer Liste zu erstellen, dann die Tupel sortieren, dann die Liste glätten. Aber es gibt keine Assoziation am Anfang und am Ende, nur 0.0 ... –

+0

warum ''entra', 5 'wird vom Ergebnis verpasst? – RomanPerekhrest

+0

oops vergaß den Eintrag a. Bearbeitet – Plinzelplein

Antwort

0

Ich bin nicht ganz sicher, ob ich verstehe, wie Ihre ursprüngliche Liste aufgebaut ist. Wenn wir es x nennen und jeder geradzahlige Eintrag (0, 2, ...) eine Zeichenkette ist und jeder ungerade Eintrag (1, 3, ...) eine Nummer ist, die der vorhergehenden Zeichenkette zugeordnet ist, könnte man daraus eine Liste machen Tupel wie folgt:

y = zip(x[0::2], x[1::2]) 

Die Liste von Tupeln kann y dann sortiert werden:

y.sort(key=lambda t: t[1]) 

, die ergeben würde:

[(0, 0), 
(0, 0), 
(0, 0), 
(0, 0), 
(0, 0), 
(0, 0), 
('entry', 1), 
('entrya', 5), 
('anotherentry', 7), 
('entryb', 10), 
('entryd', 30)] 

Does diese Hilfe?

EDIT:

Um es in eine Liste abflachen wieder:

z = [entry for tup in y for entry in tup] 
+0

Es gibt eine ungerade Anzahl von Nullen am Anfang, also funktioniert das nicht. – AChampion

+0

@AChampion Ich dachte, man könnte fehlen. Wenn die Liste tatsächlich eine Liste von Paaren ist, dann hat sie eine Struktur, die Sinn ergibt. Wenn es nur eine beliebige Anzahl von Nullen gibt, die keine Informationen enthalten, würde ich vorschlagen, zuerst eine andere Darstellung der Daten zu finden. – sigvaldm

+1

nein, es hat gut funktioniert, die ungerade Anzahl von Nullen war meine Schuld, sorry. Es sollte eine gleichmäßige Menge an Nullen sein – Plinzelplein

0

Mein Ansatz ist Element in Ihrer Liste in Tupel wie dieser erste zip:

[('null', 0), ('null', 0), ('null', 0), ('entrya', 5), ('entryb', 10), ('anotherentry', 7), ...] 

Danach Sie kann das Element nach dem zweiten Element sortieren.

ls = [0, 0, 0, 0, 0, 'entrya', 5, 'entryb', 10, 'anotherentry', 7, 
    'entry', 1, 'entryd', 30, 0, 0, 0, 0, 0, 0] 

ls_zip_elem = [] 
for x1, x2 in zip(ls, ls[1:]): 
    if x1 == 0: 
     ls_zip_elem.append(('null', x1)) 
    elif not str(x1).isdigit(): 
     ls_zip_elem.append((x1, x2)) 
    else: 
     pass 
ls_zip_elem_sorted = sorted(ls_zip_elem, key=lambda x: x[1]) # sorted 

# put the list back 
ls_sorted = [] 
for x1, x2 in ls_zip_elem_sorted: 
    if x1 == 'null': 
     ls_sorted.append(x2) 
    else: 
     ls_sorted.extend([x1, x2]) 

# output 
# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'entry', 1, 'entrya', 5, 'anotherentry', 7, 
# 'entryb', 10, 'entryd', 30] 
0

Dies scheint eine sehr seltsam Dataset, aber vorausgesetzt, Sie dies wirklich tun müssen dann:
Wenn Sie die 0 s am Anfang entfernen und das Ende dann ist es ziemlich einfach zu sortieren:

>>> l = ['entrya', 5, 'entryb', 10, 'anotherentry', 7, 'entry', 1, 'entryd', 30] 
>>> [b for a in sorted(zip(*[iter(l)]*2), key=lambda x: x[1]) for b in a] 
['entry', 1, 'entrya', 5, 'anotherentry', 7, 'entryb', 10, 'entryd', 30 

So vorausgesetzt, Sie haben keine 0 als Wert für Ihre anderen entries, dann können Sie dies als 2 Fälle behandeln, sortieren Sie alles nicht null in Paaren und fügen Sie dann alle Nullen zurück.

>>> l = [0,0,0,0,0,'entrya',5, 'entryb', 10, 'anotherentry', 7, 'entry', 1, 'entryd', 30, 0,0,0,0,0] 
>>> pairs = [b for a in sorted(zip(*[iter(filter(lambda x: x!=0, l))]*2), key=lambda x: x[1]) for b in a] 
>>> zeros = list(filter(lambda x: x == 0, l)) 
>>> pairs + zeros 
['entry', 1, 'entrya', 5, 'anotherentry', 7, 'entryb', 10, 'entryd', 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
0

Sie können reduce von functools Modul, add von operator, zip und sorted() benutzen, um Ihre gewünschte Ausgabe zu haben.

NB:

In dieser Lösung:

  • Sie benötigen Ihre Eingabeliste und trennen die Nullen aus es zu analysieren.
  • Dann wurde ein Paar aus den Daten, ohne Nullen darin erstellen, basierend auf dem zweiten Element
  • Schließlich Schritt 2 mit einer Liste der Nullstellen von Schritt 1

Diese verketten ist ein Beispiel:

from operator import add 
from functools import reduce 

data = [0,0,0,0,0,'entrya',5, 'entryb', 10, 'anotherentry', 7, 'entry', 1, 'entryd', 30, 0,0,0,0,0,0] 
non_zeros, zeros = [k for k in data if k is not 0], [0]*data.count(0) 
pairs = [[k,v] for k,v in zip(non_zeros[::2], non_zeros[1::2])] 

final = reduce(add, sorted(pairs, key= lambda x: x[1])) + zeros 
print(final) 

Ausgang:

['entry', 1, 'entrya', 5, 'anotherentry', 7, 'entryb', 10, 'entryd', 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
Verwandte Themen