Как поменять местами элементы в списке в любой момент? - PullRequest
0 голосов
/ 16 июня 2020
l = [ 1 ,2 ,3, 4,
      5 ,6 , 7,8,

      9,10,11,12,
      13,14,15,16,

      17,18,19,20,
      21,22,23,24
     ]

При переходе на следующую строку происходит посередине. Предполагаемый результат:

l = [     1 ,2 ,7,8,
          5 ,6 ,3,4,

          9,10,15,16,
          13,14,11,12,

          17,18,23,24,
          21,22,19,20
         ]

Рабочий код:

n = len(l) #length of list
c = 4 # column length
h =int(c/2)  #middle crossover point 

for i in range(int(c/2) , n+1, int(2*c) ):
    l[i:i+h], l[i+c:i+(c+h)] = l[i+c:i+(c+h)],l[i:i+h]
print (l)

Теперь мой код работает только при средней точке пересечения. Я хочу масштабировать его до любой точки кроссовера. Как я могу это сделать ? Например, если точка пересечения - 2-й элемент, вывод должен быть:

l = [ 1 ,6,7,8,
      5 ,2,3,4,

      9,14,15,16,
      13,10,11,12,

      17,22,23,24,
      21,18,19,20
     ]

Также обратите внимание, что длина столбца может быть любой, в этом примере это 4.

Ответы [ 3 ]

0 голосов
/ 16 июня 2020

Используйте здесь встроенный своп. Нет теста для всех условий.

def swap(lst, offset, distance, items):
    for i in range(offset, len(lst)-distance-items+1, 2*distance):
        lst[i:i+items], lst[i+distance:i+distance+items] = (
            lst[i+distance:i+distance+items], lst[i:i+items])

lst = [i+1 for i in range(24)]

swap(lst, 1, 6, 5)  # column offset:1, row length:6, item:5 to swap in-line
[ 1,  8,  9, 10, 11, 12,
     -------swap--------
  7,  2,  3,  4,  5,  6,
 13, 20, 21, 22, 23, 24,
     -------swap--------
 19, 14, 15, 16, 17, 18]
: Parameters
  lst - list to swap elements
  offset - the start index of elements to swap
  distance - the distance between each start index of elements to swap, you can think it is same as width of total columns.
  items - the number of continue elements to swap
: Return
  None, in-line swap
0 голосов
/ 16 июня 2020
def swap_lines(l, crossover, row_len):
    """Swap the elements of two different rows in any number of columns.

    Parameters
    ----------
    l : list
        Your list.
    crossover : int
        The first index of the columns to swap.
    row_len : int
        The length of each row
    """
    new_list = l.copy()
    for c in range(crossover, row_len):
        new_list[c::2*row_len] = l[c+row_len::2*row_len]
        new_list[c+row_len::2*row_len] = l[c::2*row_len]
    return new_list

Это разделит список, чтобы получить каждый элемент в той же позиции «блока» (например, l [2 :: 8] дает вам каждый элемент в первой строке, третьем столбце) и поменяет его местами с элемент во второй строке блока.

Вход:

swap_lines(list(range(1, 25), 2, 4)

Выход:

[1, 2, 7, 8, 
 5, 6, 3, 4, 

 9, 10, 15, 16, 
 13, 14, 11, 12, 

 17, 18, 23, 24, 
 21, 22, 19, 20]
0 голосов
/ 16 июня 2020

Вот один из способов сделать это:

a = int(input()) # Swap index
cl = 4 # Amount of columns

l = [1, 2, 3, 4,
     5, 6, 7, 8,
     9, 10, 11, 12,
     13, 14, 15, 16,
     17, 18, 19, 20,
     21, 22, 23, 24]

l2 = l.copy()

for i,v in enumerate(l):
    if i in range(a,len(l),cl*2):
        l2[i] = l[i+cl]
        l2[i+cl] = l[i]
        l2[i+1] = l[i+cl+1]
        l2[i+cl+1] = l[i+1]


print(l2)

Ввод:

0

Выход:

[5, 6, 3, 4,
 1, 2, 7, 8,
 13, 14, 11, 12,
 9, 10, 15, 16,
 21, 22, 19, 20,
 17, 18, 23, 24]

Вход:

1

Вывод:

[1, 6, 7, 4,
 5, 2, 3, 8,
 9, 14, 15, 12,
 13, 10, 11, 16,
 17, 22, 23, 20,
 21, 18, 19, 24]

Вход:

2

Вывод:

[1, 2, 7, 8,
 5, 6, 3, 4,
 9, 10, 15, 16,
 13, 14, 11, 12,
 17, 18, 23, 24,
 21, 22, 19, 20]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...