2016-07-31 6 views
-1

Ich versuche, die Liste aller k Tupel auf den Zahlen 0 bis n-1 zu generieren, aber ich möchte diese Liste in Revlex bestellt werden. Zum BeispielReihenfolge der Tupel in Revlex

import itertools 
list(itertools.combinations(range(0, 6), 3)) 

gibt diese Tupel in lexikographischer Reihenfolge:

[(0, 1, 2), (0, 1, 3), (0, 1, 4), (0, 1 , (0, 2, 3), (0, 2, 4), (0, 2, 5), (0, 3, 4), (0, 3, 5), (0, 4, 5), (1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5), (2, 3, 4), (2, 3, 5), (2, 4, 5), (3, 4, 5)]

während ich möchte, dass der Ausgang durch umgekehrtes lexikographisches bestellt wird:

[(0,1,2), (0,1,3), (0,2,3), (1,2,3), (0,1,4), (0,2,4), (1,2,4), (0, 3,4, 1,3,4, 2,3,4, 0,1,5, 0,2,5, 1,2,5, 0,3, 5), (1,3,5), (2,3,5), (0,4,5), (1,4,5), (2,4,5), (3,4,5) ]

Danke!

+0

Können Sie "reverse lexicographic" in Worten oder einer mathematischen Formel erklären? Ihre Bestellung Ihres Beispiels ist nicht klar, zumindest nicht für mich. –

+0

Wir sagen (a_1, ..., a_k)> (b_1, ..., b_k) in umgekehrter lexikographischer Form (Revlex), wenn der äußerste rechte Teil der Differenz (a_1 - b_1, ..., a_k - b_k) negativ ist . Im obigen Beispiel gilt (1,2,3)> (0,1,4) durch Betrachten des letzten Eintrags dieser Tupel 3 - 4 = -1. – dc2814

Antwort

1

Ihr umgekehrter lexikographischer Auftrag sortiert nach letztem Element, dann vorletzter usw. Eine Möglichkeit ist, den Bereich zu nehmen, diesen Bereich umzukehren, itertools zu verwenden, um alle Kombinationen daraus zu machen, jedes Element umzukehren diese Kombinationen Liste, dann schließlich die Gesamtliste umkehren. Eine Liste oder ein Tupel kann durch Schneiden mit [::-1] umgekehrt werden, so dass die Umkehrung mylistmylist[::-1] ist. Hiermit können wir einen komplizierten Ausdruck

[i[::-1] for i in itertools.combinations(range(6)[::-1],3)][::-1] 

Die range Funktion verfügt über eine eingebaute Möglichkeit, stetige Abnahme zu bekommen zu bekommen. Wenn wir das verwenden, erhalten wir

[i[::-1] for i in itertools.combinations(range(5,-1,-1),3)][::-1] 

, die nicht einfacher aussieht. Jeder dieser Ausdrücke gibt das Ergebnis

[(0, 1, 2), 
(0, 1, 3), 
(0, 2, 3), 
(1, 2, 3), 
(0, 1, 4), 
(0, 2, 4), 
(1, 2, 4), 
(0, 3, 4), 
(1, 3, 4), 
(2, 3, 4), 
(0, 1, 5), 
(0, 2, 5), 
(1, 2, 5), 
(0, 3, 5), 
(1, 3, 5), 
(2, 3, 5), 
(0, 4, 5), 
(1, 4, 5), 
(2, 4, 5), 
(3, 4, 5)] 

was Sie wollen.

Es gibt Routinen, die dies tun können, und Sie könnten diesen Ausdruck in mehrere Zeilen mit Zwischenvariablen zerlegen. Jeder wäre klarer als dieser Ausdruck. Die mehreren Linien könnten sein:

r = range(6)[::-1] 
c = itertools.combinations(r, 3) 
l = [i[::-1] for i in c] 
rl = l[::-1] 

Nun ist die Variable rl hält die gewünschte Liste.

All dies wurde in Python 2.7.12 getestet. In Python 3 müssen Sie wahrscheinlich list() um r setzen.

+0

Vielen Dank! Genau das habe ich gesucht. – dc2814