Подсчёт с помощью таблицы
Словари отлично подходят для подсчёта. Эмма записала погоду каждого дня недели и хочет узнать, сколько дней было солнечных, дождливых и облачных. Сделайте словарь, где ключи — виды погоды, а значения — количество дней. Начните с пустой таблицы и пройдите по списку; для каждого дня прибавляйте 1 к числу для его погоды:
local weather = {"sunny", "rainy", "sunny", "cloudy", "sunny", "rainy", "sunny"}
local days = {}
for _, w in ipairs(weather) do
days[w] = (days[w] or 0) + 1
end
print("Солнечных дней: " .. days.sunny)
print("Дождливых дней: " .. days.rainy)
print("Облачных дней: " .. days.cloudy)Выведется:
Солнечных дней: 4
Дождливых дней: 2
Облачных дней: 1Главная строка — days[w] = (days[w] or 0) + 1. Проследите за ней на первых трёх днях:
- В первый день
wравно"sunny". Ключаsunnyещё нет, поэтомуdays[w]равноnil,nil or 0равно0, иdays.sunnyстановится1. - Во второй день
wравно"rainy", и такого ключа тоже нет:days.rainyстановится1. - В третий день снова
"sunny". Теперьdays[w]равно1,1 or 0равно1, иdays.sunnyстановится2.
Заранее знать, какая бывает погода, не нужно. Новый вид получает собственный ключ, когда встречается в первый раз.
Две типичные ошибки:
- Без
or 0:days[w] = days[w] + 1уже в первый день заканчивается ошибкойattempt to perform arithmetic on a nil value (field '?'), потому что прибавлять 1 пока не к чему. - Без скобок:
days[w] = days[w] or 0 + 1. Ошибки нет, но+выполняется раньшеor, поэтому Lua вычисляетdays[w] or 1, и любая погода так и остаётся на 1.
Тот же приём складывает суммы вместо подсчёта: totals[crop] = (totals[crop] or 0) + amount.
Чтобы найти, что встречалось чаще всего, пройдите по счётчикам через pairs и примените приём поиска наибольшего значения из урока про списки. Порядок pairs здесь не важен: каким бы он ни был, наибольшее число одно и то же:
local days = {sunny = 4, rainy = 2, cloudy = 1}
local best = nil
local bestCount = 0
for w, count in pairs(days) do
if count > bestCount then
best = w
bestCount = count
end
end
print("Чаще всего: " .. best .. " (" .. bestCount .. ")")Выведется:
Чаще всего: sunny (4)В уроке про списки вы начинали поиск с первого элемента. У словаря первого элемента нет, но счётчик никогда не бывает меньше 1, поэтому здесь можно спокойно начать с 0. И только если бы у двух видов погоды было одинаковое наибольшее число, порядок решал бы, какой из них выведется.
Задание
- 1
Посчитайте, сколько штук каждой культуры продала Эмма: создайте пустую таблицу
countsи заполните её в цикле поsold. Затем выведите из неё количество моркови и клубники:Морковь: 4 Клубника: 3 - 2
Ниже найдите культуру, которая продавалась лучше всех: пройдите по
countsчерезpairsи запоминайте наибольшее количество. Выведите:Хит продаж: carrot (4)