Чтобы объяснить, почему ваш скрипт не работает прямо сейчас, я переименую переменную unsorted
в sorted
.
Сначала ваш список еще не отсортирован. Конечно, мы устанавливаем sorted
в False
.
Как только мы начинаем цикл while
, мы предполагаем, что список уже отсортирован. Идея такова: как только мы находим два элемента, которые находятся не в правильном порядке, мы возвращаем sorted
на False
. sorted
останется True
, только если в неправильном порядке не было элементов .
sorted = False # We haven't started sorting yet
while not sorted:
sorted = True # Assume the list is now sorted
for element in range(0, length):
if badList[element] > badList[element + 1]:
sorted = False # We found two elements in the wrong order
hold = badList[element + 1]
badList[element + 1] = badList[element]
badList[element] = hold
# We went through the whole list. At this point, if there were no elements
# in the wrong order, sorted is still True. Otherwise, it's false, and the
# while loop executes again.
Есть также незначительные проблемы, которые помогли бы коду быть более эффективным или читаемым.
for
вы используете переменную element
. Технически element
не является элементом; это число, представляющее индекс списка. Кроме того, это довольно долго. В этих случаях просто используйте временное имя переменной, например i
для «index». for i in range(0, length):
range
также может принимать только один аргумент (с именем stop
). В этом случае вы получите список всех целых чисел от 0 до этого аргумента. for i in range(length):
def bubble(bad_list):
(badList[i+1], badList[i])
есть (3, 5)
), а затем присваивается двум переменным в левой части ((badList[i], badList[i+1])
). bad_list[i], bad_list[i+1] = bad_list[i+1], bad_list[i]
Поместите все это вместе, и вы получите следующее:
my_list = [12, 5, 13, 8, 9, 65]
def bubble(bad_list):
length = len(bad_list) - 1
sorted = False
while not sorted:
sorted = True
for i in range(length):
if bad_list[i] > bad_list[i+1]:
sorted = False
bad_list[i], bad_list[i+1] = bad_list[i+1], bad_list[i]
bubble(my_list)
print my_list
(Я также удалил ваш оператор печати.)
Вы можете использовать Array#join
для явного преобразования массива классов в строку разделенных пробелами имен классов:
<div class="item col-3 p-2 a b <%= meal[:type].join(' ') %>">
Как это работает:
[111 ] Обратите внимание, что meal[:type].each
не делает то, что вы думаете, он делает. Он вызывает блок для каждого элемента в массиве meal[:type]
, ожидая, что блок выполняет побочный эффект (например, записывает что-то или сохраняет что-то), а затем возвращает неизмененный массив meal[:type]
. Если вы хотите получить новый массив, вам придется использовать Array#map
вместо:
> meal[:type].each { |t| t.reverse }
=> ["program", "veggies"] # the block doesn’t affect the return value
> meal[:type].map { |t| t.reverse }
=> ["margorp", "seiggev"] # the block affects each returned element