Многомерный характер списков: продвинутые приложения
Давайте углубимся в многомерную природу списков. Чтобы найти любой элемент двумерного списка, вы должны использовать две координаты:
- вертикальный (номер строки)
- и горизонтальный (номер столбца).
Представьте, что Вы разрабатываете программное обеспечение для автоматической метеостанции. Прибор фиксирует температуру воздуха ежечасно и делает это в течение месяца. Это дает Вам в общей сложности 24 × 31 = 744 значения. Попробуем составить список, способный хранить все эти результаты.
Во-первых, Вы должны решить, какой тип данных подходит для этого приложения. В этом случае лучше всего подойдет float
, поскольку этот термометр может измерять температуру с точностью до 0,1 ℃.
Затем Вы принимаете произвольное решение, что строки будут записывать показания каждый час (таким образом строка будет иметь 24 элемента), и каждая из строк будет назначена одному дню месяца (предположим, что в каждом месяце 31 день, а значит Вам понадобится 31 строка). Вот подходящая пара включений (h
для часа, d
для дня):
temps = [[0.0 for h in range(24)] for d in range(31)]
Теперь вся матрица заполнена нулями. Можно предположить, что она обновляется автоматически с помощью специальных аппаратных агентов. Остается дождаться заполнения матрицы измерениями.
Пришло время определить среднемесячную полуденную температуру. Сложите все 31 показание, записанное в полдень, и разделите полученную сумму на 31. Вы можете предположить, что сначала сохраняется полуночная температура. Вот соответствующий код:
temps = [[0.0 for h in range(24)] for d in range(31)]
#
# The matrix is magically updated here.
#
total = 0.0
for day in temps:
total += day[11]
average = total / 31
print("Average temperature at noon:", average)
Примечание: переменная day
, используемая циклом for
, не является скаляром - каждый проход через матрицу temps
присваивает ей следующие строки матрицы; следовательно, это список. Он должен быть проиндексирован значением 11
, чтобы получить доступ к значению температуры, измеренному в полдень.
Теперь найдите самую высокую температуру за весь месяц - посмотрите на код:
temps = [[0.0 for h in range(24)] for d in range(31)]
#
# The matrix is magically updated here.
#
highest = -100.0
for day in temps:
for temp in day:
if temp > highest:
highest = temp
print("The highest temperature was:", highest)
Примечание:
- переменная
day
выполняет итерацию по всем строкам в матрицеtemps
; - переменная
temp
выполняет итерацию по всем измерениям, выполненным за один день.
Теперь посчитайте дни, когда температура в полдень была не ниже 20 ℃:
temps = [[0.0 for h in range(24)] for d in range(31)]
#
# The matrix is magically updated here.
#
hot_days = 0
for day in temps:
if day[11] > 20.0:
hot_days += 1
print(hot_days, "days were hot.")