Я хочу отсортировать массив в волновой форме, но он говорит, что int не подлежит подписке

#arrays #python-3.x #sorting #arraylist #compare-and-swap

#массивы #python-3.x #сортировка #arraylist #сравнение и обмен

Вопрос:

Вот мой код

 def wave(arr):
  for indx,el in enumerate(arr):
    if indx != 0 and indx%2 == 0:
      if el[indx] < el[indx-1]:
        arr[indx-1], arr[indx]= arr[indx],arr[indx-1]
      if el[indx] < el[indx 1]:
        arr[indx], arr[indx 1]= arr[indx 1],arr[indx]
  return arr

li = [3,5,12,5,3]
print(wave(li))
 

Логика, которую я использую здесь, заключается в сравнении четного элемента с их побочным элементом и соответствующей замене.

Ответ №1:

Если вы проверите тип вашей el переменной, вы увидите, что это целое число ( <class 'int'> ). Итак, ваша попытка сделать это так : int[int] . Это бессмысленно и невозможно в Python.

Вы можете это проверить:

 def wave(arr):
    for indx, el in enumerate(arr):
        print(type(el))  # <class 'int'>
        ....
 

Я попытался выяснить ваши ожидания (вы не написали свои ожидания в своем вопросе), и я написал рабочий код с несколькими комментариями.

Код:

 def wave(arr):
    for indx, el in enumerate(arr):
        # If the index is not zero AND the element is even AND element is not the last one
        if indx != 0 and indx % 2 == 0 and indx != len(arr) - 1:
            if arr[indx] < arr[indx - 1]:  # If the left side is greater
                arr[indx - 1], arr[indx] = arr[indx], arr[indx - 1]
            if arr[indx] < arr[indx   1]:  # If the right side is greater
                arr[indx], arr[indx   1] = arr[indx   1], arr[indx]
    return arr


li = [3, 5, 12, 5, 3]
print(wave(li))  # expected: [3, 5, 12, 5, 3]

li = [3, 5, 12, 15, 3, 8]
print(wave(li))  # expected: [3, 5, 15, 3, 12, 8]
 

Вывод:

 >>> python3 test.py
[3, 5, 12, 5, 3]
[3, 5, 15, 3, 12, 8]