Meine Liste enthält zufällige Ganzzahlen in keiner Reihenfolge. Ich möchte Elemente austauschen und dabei die Reihenfolge der Liste beibehalten.

ran=[1,1,2,1]

Und ich möchte sagen, 1 und 2 tauschen:

swap(ran,1,2)
output:
2212

Oder

ran=[3,3,1,2]
swap(ran,1,3)
output:
1132

Ich habe eine Swap-Funktion ausprobiert, aber ich weiß, dass meine Iterationslogik nicht sehr gut ist.

def swap(c,x,y):

arr=[]

for i, v in enumerate(c):
        if v==x or v==y:
            for j,v2 in enumerate(c):
                if v2==y or v2==x:
                    arr[i], arr[j] = arr[j], arr[i]

Dies ändert nur einen der Werte.

Das Problem besteht darin, nicht zu wissen, welcher Index bereits geändert wurde.

0
Danny W 23 Feb. 2020 im 00:35

3 Antworten

Beste Antwort

Die Beispiele, die Sie gegeben haben, deuten darauf hin, dass der gewünschte Prozess nicht wirklich ein "Austausch" einzelner Elemente als solcher ist, sondern eher ein bidirektionales "Suchen und Ersetzen". Wenn dies erforderlich ist, würde eine viel einfachere Schleife funktionieren:

def swap(c, x, y):
  for i, v in enumerate(c):
    if v == x:
      c[i] = y
    elif v == y:
      c[i] = x
4
cschatz 22 Feb. 2020 im 21:48

Ich denke, Sie könnten so etwas gebrauchen:

def swap(lst,x,y):
    ret = lst
    for e in range(0,length(lst)):
        if x == lst[e]:
            ret[e] = y
        if y == lst[e]:
            ret[e] = x
    return ret
0
Miles C. 22 Feb. 2020 im 22:01

Verwenden Sie ein Diktat, um die Auslagerungslogik zu codieren und mit get(e, e) zu indizieren. Alle nicht austauschbaren Elemente, die nicht im Diktat enthalten sind, werden in Ruhe gelassen.

>>> def swap(lst, x, y):
...     swaps = {x: y, y: x}
...     return [swaps.get(e, e) for e in lst]
...
>>> swap([1, 1, 2, 1], 1, 2)
[2, 2, 1, 2]

Sie können dies verallgemeinern, indem Sie den Anrufer ein Wörterbuch übergeben lassen, um die Swaps anzugeben. Hier ist eine eng verwandte Frage.

3
ggorlen 22 Feb. 2020 im 21:51