2014-01-24 11 views
5
ss = [(0,'bb','jj'), (1,'aa','mm'), (2,'aa','kk'),(3,'bb','ee'),(4,'gg','ff')] 

for x in ss: 
    pp = <somthing> 

Python verwenden, ist es möglich, von ss in pp einzufügen und pp durch zwei Attribute sortiert zu halten, sagen wir mal von der 2. dann dritte Position, um das folgende Ergebnis zu haben (beide Attribute aufsteigend):Pflegen Sie eine Liste sortiert nach mehreren Attributen?

pp = [(2, 'aa', 'kk'), (1, 'aa', 'mm'), (3, 'bb', 'ee'), (0, 'bb', 'jj'), (4, 'gg', 'ff')] 

Or (beide Attribute absteigend):

pp = [(4, 'gg', 'ff'), (0, 'bb', 'jj'), (3, 'bb', 'ee'), (1, 'aa', 'mm'), (2, 'aa', 'kk')] 

ich will nicht die folgenden zwei statments nach der Schleife verwenden, die bereits die Arbeit machen:

pp = sorted(ss, key = operator.itemgetter(1, 2)) 
pp = sorted(ss, key = operator.itemgetter(1, 2), reverse=True) 

Weil ich mit einer sehr langen Liste beschäftige und ich bereits die Schleife habe, die ich für das Sortieren auch wiederverwenden möchte.

+0

Schauen Sie sich das [bisect] (http://docs.python.org/3/library/bisect.html) Modul an. – poke

+1

Fügen Sie die neuen Elemente zu 'pp' in Ihrer Schleife hinzu (oder schreiben Sie einfach' pp.xtend (ss) '), dann rufen Sie' pp.sort' mit den gleichen Argumenten auf wie die Aufrufe von 'sorted', die Sie nicht wollen machen. Dank Timsort ist dies die effiziente Möglichkeit, eine sortierte Liste in Python zu verwalten. –

+0

Hmm, habe gerade festgestellt, dass du den ursprünglichen Inhalt von 'pp' nicht behältst. Dann ignoriere den Teil über 'extend'. Ich verstehe nicht, warum du nicht die "sortierten" Zeilen benutzen willst. Unabhängig von der Größe der Liste ist 'sorted' eine effiziente Möglichkeit, eine sortierte Kopie davon zu erstellen. Sie werden * keine * bessere Leistung erzielen, wenn Sie jedes Element wiederholt an der richtigen Stelle einfügen. Das nennt man "Insertion sort", und wenn es ein guter Sortieralgorithmus wäre, würde 'sorted' es wahrscheinlich verwenden. Für große Listen ist es nicht gut. –

Antwort

2

Sie können die Binärsuche bei jedem Einfügen verwenden.

ss = [(0,'bb','jj'), (1,'aa','mm'), (2,'aa','kk'),(3,'bb','ee'),(4,'gg','ff')] 

l = [] 

def insert_sort(l, e, compare): 
    lo = 0 
    hi = len(l) 
    while lo < hi: 
     mid = (lo+hi)/2 
     if compare(e, l[mid]): 
      lo = mid + 1 
     else: 
      hi = mid 
    l.insert(lo, e) 

ascend_list = [] 
descend_list = [] 

for i in ss: 
    insert_sort(ascend_list, i, lambda x, y: x[1:] >= y[1:]) 

for i in ss: 
    insert_sort(descend_list, i, lambda x, y: x[1:] < y[1:]) 

print ascend_list 
print descend_list 
+0

@falsetru Vielen Dank für den Vorschlag. – afkfurion

Verwandte Themen