Статья Автор: Деникина Н.В., Деникин А.В.

Таблица по строкам — короткие записи

То же самое, но короче

Всё, что было в уроке, ты умеешь писать простыми средствами: цикл, счётчик, фильтрация списка. Этого хватает для любой задачи 9, и на экзамене этого достаточно.

Но есть три готовых инструмента, которые сокращают запись. Их стоит знать — и понимать, когда они помогают, а когда только запутывают.

1. enumerate — номер строки без отдельного счётчика

k = 0
for row in rows:
    k = k + 1
    ...

# то же самое:
for k, row in enumerate(rows, 1):
    ...

Единица во втором аргументе и есть нумерация с первой строки. Забудешь её — нумерация пойдёт с нуля и ответ уедет.

2. set — различны ли числа

len(row) == len(set(row))

set выбрасывает повторы. Если после этого длина не изменилась — значит повторов и не было.

3. Counter — сколько раз встречается каждое

from collections import Counter

c = Counter(row)
print(sorted(c.values(), reverse=True))

Даёт профиль строки: [3, 1, 1, 1] — одно число трижды, остальные различны; [3, 3] — два числа по три раза; [1, 1, 1, 1, 1, 1] — все разные.


Честное сравнение

Вот условие демоверсии, записанное через Counter:



Что получилось

43

43 строк нужной формы — столько же, сколько давали две кучки. Записи разные, ответ один.

Но посмотри на них рядом. Кучки читаются вслух: «повторяющиеся — вот эти, одиночные — вот эти, проверяем, что тех три и этих три». Профиль из Counter надо сначала расшифровать: что такое [3, 1, 1, 1] и почему именно в таком порядке.

Правило простое: чем меньше в программе особых функций, тем легче её проверить и починить. Пиши коротко там, где короткая запись понятнее — и не гонись за краткостью там, где она прячет смысл.


Что вернёт len(set([5, 5, 5, 9, 9, 9]))?


Забыли единицу: for k, row in enumerate(rows):. Что случится?


Профиль строки из Counter получился [3, 3]. Что это значит?

Attached files
9-1.csv
Печать