Wie kann ich eine Liste nachbestellen? [geschlossen]

107

Wenn ich eine Liste habe, [a,b,c,d,e]wie kann ich die Artikel auf beliebige Weise neu anordnen [d,c,a,b,e]?

Edit: Ich möchte sie nicht mischen. Ich möchte sie in einer vordefinierten Weise nachbestellen. (Ich weiß zum Beispiel, dass das dritte Element in der alten Liste das erste Element in der neuen Liste werden sollte.)

Niyaz
quelle
Wahrscheinlich Duplikat von stackoverflow.com/questions/976882/…
kgiannakakis
4
Ohne anzugeben, wie Sie die Artikel bestellen möchten, ist es schwer zu beantworten. Möchten Sie sie sortieren? Mische sie? Einige von ihnen entfernen?
Mizipzor
@tvanfosson: In diesem Fall könnte Beliebig auch bedeuten: Nehmen Sie eine beliebige (aber gut definierte) Sortierfunktion.
Felix Kling
1
@mizipzor Ich möchte sie auf vordefinierte Weise nachbestellen. (Die Frage wurde bearbeitet, um dies zu klären.)
Niyaz
@ SilentGhost Es wird einen neuen Index haben. Kann 4 sein. Der Punkt ist, dass ich die neue Reihenfolge der Artikel kenne.
Niyaz

Antworten:

226

Sie können es so machen

mylist = ['a', 'b', 'c', 'd', 'e']
myorder = [3, 2, 0, 1, 4]
mylist = [mylist[i] for i in myorder]
print(mylist)         # prints: ['d', 'c', 'a', 'b', 'e']
AJ.
quelle
Dadurch wird eine neue Variable erstellt. Wie kann ich eine Liste vor Ort nachbestellen? Danke
Verwirrt
@Confounded Ändern Sie einfach die letzte Zeile in:mylist[:] = [mylist[i] for i in myorder]
Adam
13
>>> a = [1, 2, 3]
>>> a[0], a[2] = a[2], a[0]
>>> a
[3, 2, 1]
SilentGhost
quelle
1
Ich konnte die Syntax einfach nicht verstehen, bis mir klar wurde, dass es sich um eine paarweise gleichzeitige Zuweisung handelt . ´ :-)
geliebt.von.Jesus
11
>>> import random
>>> x = [1,2,3,4,5]
>>> random.shuffle(x)
>>> x
[5, 2, 4, 3, 1]
Kennzeichen
quelle
@ wenlibin02, habe es gerade unter 2.7.5 ausgeführt und es funktioniert immer noch einwandfrei. Bekommst du einen Fehler?
Mark
Kein Fehler, ich tippe einfach: 1) importiere zufällig; x = [1, 2, 3]; random.shuffle (x); #it ​​gibt None zurück; und 2) ich habe np.random.shuffle ausprobiert. Die Ergebnisse sind die gleichen.
Libin Wen
Oh, Entschuldigung! Mir war nicht klar, dass ich den Wert von x direkt ändere. Es gab keine zurück. Und es funktioniert. Vielen Dank.
Libin Wen
6

Wird die endgültige Reihenfolge durch eine Liste von Indizes definiert?

>>> items = [1, None, "chicken", int]
>>> order = [3, 0, 1, 2]

>>> ordered_list = [items[i] for i in order]
>>> ordered_list
[<type 'int'>, 1, None, 'chicken']

bearbeiten: meh. AJ war schneller ... Wie kann ich eine Liste in Python neu anordnen?

Raphaël Saint-Pierre
quelle
3
>>> a=["a","b","c","d","e"]
>>> a[0],a[3] = a[3],a[0]
>>> a
['d', 'b', 'c', 'a', 'e']
Ghostdog74
quelle
2

Sie können Ihre eigene Sortierfunktion bereitstellen, um list.sort():

Die sort () -Methode verwendet optionale Argumente zur Steuerung der Vergleiche.

  • cmp gibt eine benutzerdefinierte Vergleichsfunktion von zwei Argumenten (Listenelementen) an, die eine negative, null oder positive Zahl zurückgeben soll, je nachdem, ob das erste Argument als kleiner, gleich oder größer als das zweite Argument angesehen wird : cmp=lambda x,y: cmp(x.lower(), y.lower()). Der Standardwert ist None.

  • Schlüssel gibt eine Funktion eines Arguments an, mit der ein Vergleichsschlüssel aus jedem Listenelement extrahiert wird : key=str.lower. Der Standardwert ist None.

  • reverse ist ein boolescher Wert. Wenn True festgelegt ist, werden die Listenelemente so sortiert, als ob jeder Vergleich umgekehrt wäre.

Im Allgemeinen sind die Schlüssel- und Rückwärtskonvertierungsprozesse viel schneller als die Angabe einer äquivalenten cmp-Funktion. Dies liegt daran, dass cmp für jedes Listenelement mehrmals aufgerufen wird, während Taste und Rückwärts jedes Element nur einmal berühren.

Felix Kling
quelle
2
und wie genau würden Sie das umsetzen?
SilentGhost
@ SilentGhost: Dies ist als allgemeine Antwort gedacht. Im Fall der OP ist Ihre Antwort angemessener. Trotzdem halte ich es für wichtig zu wissen, dass es eine generische Lösung gibt.
Felix Kling
2

Wenn Sie Numpy verwenden, gibt es eine gute Möglichkeit, dies zu tun:

items = np.array(["a","b","c","d"])
indices = np.arange(items.shape[0])
np.random.shuffle(indices)
print(indices)
print(items[indices])

Dieser Code gibt Folgendes zurück:

[1 3 2 0]
['b' 'd' 'c' 'a']
user2228129
quelle
1
OP sucht nach einer bestimmten Neuordnung, nicht nach einem generischen Mischen.
Teepeemm
2

Wenn Ihnen die Effizienz nicht so wichtig ist, können Sie sich auf die Array-Indizierung von numpy verlassen, um sie elegant zu gestalten:

a = ['123', 'abc', 456]
order = [2, 0, 1]
a2 = list( np.array(a, dtype=object)[order] )
Shaohua Li
quelle
1

Nach meinem Verständnis Ihrer Frage möchten Sie anscheinend eine Permutation anwenden, die Sie auf a angeben list. Dies erfolgt durch Angabe eines anderen list(nennen wir es p), der die Indizes der Elemente des Originals enthält list, die im permutierten erscheinen sollen list. Anschließend perstellen Sie ein neues listElement, indem Sie einfach das Element an jeder Position durch das Element ersetzen, dessen Index sich an dieser Position in befindet p.

def apply_permutation(lst, p):
    return [lst[x] for x in p]

arr=list("abcde")
new_order=[3,2,0,1,4]

print apply_permutation(arr,new_order)

Dies wird gedruckt ['d', 'c', 'a', 'b', 'e'].

Dies schafft tatsächlich ein neues list, kann aber trivial modifiziert werden, um das Original "an Ort und Stelle" zu permutieren.

MAK
quelle
1

Eine weitere Sache, die berücksichtigt werden kann, ist die andere Interpretation, auf die Darkless hinweist

Code in Python 2.7

Hauptsächlich:

  1. Nach Wert neu ordnen - Bereits von AJ oben gelöst
  2. Nach Index neu ordnen

    mylist = ['a', 'b', 'c', 'd', 'e']
    myorder = [3, 2, 0, 1, 4]
    
    mylist = sorted(zip(mylist, myorder), key=lambda x: x[1])
    print [item[0] for item in mylist]

Dies druckt ['c', 'd', 'b', 'a', 'e']

Kshitij Satpute
quelle
0
newList = [oldList[3]]
newList.extend(oldList[:3])
newList.extend(oldList[4:])
inspectorG4dget
quelle
-1

Dies habe ich verwendet, als ich auf dieses Problem gestoßen bin.

def order(list_item, i): # reorder at index i
    order_at = list_item.index(i)
    ordered_list = list_item[order_at:] + list_item[:order_at]
    return ordered_list

EX: für die Kleinbuchstaben

order(string.ascii_lowercase, 'h'):
>>> 'hijklmnopqrstuvwxyzabcdefg'

Die Liste wird einfach auf einen bestimmten Index verschoben

AA Ron
quelle