Как поменять местами целые числа в списке, когда эти числа могут повторяться - PullRequest
0 голосов
/ 23 февраля 2020

Мой список содержит случайные целые числа в произвольном порядке. Я хочу поменять местами элементы, сохраняя порядок списка без изменений.

ran=[1,1,2,1]

И я хочу поменять местами, скажем, 1 и 2:

swap(ran,1,2)
output:
2212

или

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

Я пробовал использовать функцию подкачки, но я знаю, что моя логика итерации c не очень хороша.

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]

Это просто меняет одно из значений.

Проблема не в зная, какой индекс уже был изменен.

Ответы [ 3 ]

4 голосов
/ 23 февраля 2020

Примеры, которые вы привели, предполагают, что требуемый процесс на самом деле не является «обменом» отдельными элементами как таковым, а скорее двунаправленным «поиском и заменой». Если это то, что нужно, то гораздо проще будет l oop:

def swap(c, x, y):
  for i, v in enumerate(c):
    if v == x:
      c[i] = y
    elif v == y:
      c[i] = x
3 голосов
/ 23 февраля 2020

Используйте dict для кодирования лога обмена c и индексирования в нем с помощью get(e, e). Любые элементы, не подлежащие замене, которые не включены в dict, будут оставлены в покое.

>>> 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]

Вы можете обобщить это, разрешив вызывающей стороне передать в словарь для определения перестановок. Вот тесно связанный вопрос .

0 голосов
/ 23 февраля 2020

Я думаю, вы могли бы использовать что-то вроде этого:

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
...