Использование однострочного цикла для генерации HTML-классов в представлении Rails

Чтобы объяснить, почему ваш скрипт не работает прямо сейчас, я переименую переменную 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):
    
  • Руководство по стилю Python Style рекомендует, чтобы переменные назывались в нижнем регистре с символами подчеркивания. Это очень незначительная нить для маленького скрипта, подобного этому; это больше, чтобы вы привыкли к тому, что код Python чаще всего напоминает.
    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

(Я также удалил ваш оператор печати.)

1
задан Rory O'Kane 17 January 2019 в 13:04
поделиться

1 ответ

Вы можете использовать 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
0
ответ дан Rory O'Kane 17 January 2019 в 13:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: