G|Translate: English EN Français FR Deutsch DE Italiano IT Русский RU Español ES

Алгоритм суммы одинаковых элементов массива (на примере Python)

5/5 - (1 голос)

Простая задача — посчитать количество одинаковых элементов массива

Алгоритм суммы одинаковых элементов массива (на примере Python)

Глазами легко видеть, что суммы правильные :)

Попробуем теперь сделать тоже самое программно. Используем  Python. 

Логика кажется очень простой:

  • делаем счетчик
  • складываем
  • при смене элемента счетчик обнуляем
  • выводим то, что насчитали

Поехали. Будет картинками, правильный код в виде текста будет в конце статьи.

Используем интерпретатор Питона по ссылке

https://www.online-python.com/

Конечно, массив надо сначала отсортировать, что бы одинаковые элементы были рядом. Будем считать, что это сделано заранее.

Алгоритм суммы одинаковых элементов массива (на примере Python)

Позвольте, а где элемент «Три»?

Так как он в конце массива, наше условие не сработало для последнего подсчета. Точнее — сумма посчиталась, но на экран не вывелась.

Добавим условие «ИЛИ последний элемент массива«

Алгоритм суммы одинаковых элементов массива (на примере Python)

Так:

  • последний элемент «Три» появился
  • но счет неправильный, не произошло последнее суммирование

Точнее — последнее суммирование происходит — но программа не попадает уже в условие, так как цикл закончился.

Пробуем по другому — убираем условие последнего элемента и за пределами цикла еще раз выведем «print»

Алгоритм суммы одинаковых элементов массива (на примере Python)

Теперь всё посчитано правильно.

Но плохо, что у нас одинаковый вывод «print» в двух разных местах.  Это на примере просто.  А в реальности там может быть сложный вывод — и отлавливать ошибку вывода в двух местах вместо одного — это нехорошо.

Нам нужно, что бы «print» был один раз внутри цикла и всё было отображено правильно. Странно, у нас фактически простая конструкция:

  • цикл
  • внутри два модуля
    • модуль условия и вывода
    • модуль суммирования

Почему не работает нормально?

Уберем последний «print» и попробуем переставить модули внутри цикла местами.

Алгоритм суммы одинаковых элементов массива (на примере Python)

Вообще беда:

  • элемент «Три» пропал
  • первые два элемента считаются неправильно (что очевидно — теперь счетчик перед условием)

Внимание — сектор «приз»! 

А где ошибка, собственно?

Всего два модуля, один цикл, оба варианта мы попробовали.

И оба варианта неправильные..

А ошибка не в программе.

Ошибка в начальной логике. Если хорошо подумать — то нам нужна «машина времени».

Мы делаем вывод посчитанного:

  • или это последний элемент массива
  • или в следующей позиции массива уже другой элемент
  • причем эту проверку следующего элемента массива мы можем делать только, если текущий элемент не последний (иначе выйдем за пределы массива)

Алгоритм суммы одинаковых элементов массива (на примере Python)

Вот теперь всё правильно (и убран print(i), который был для отладки).

Ниже код в виде текста для копирования.

arr_data = ["Один", "Два", "Два", "Три", "Три", "Три"]
x = len(arr_data) # число элементов в массиве
find_me = arr_data[0]
count_my = 0
for i in range (x):
    # (№ 2) модуль увеличения счетчика
    count_my = count_my + 1 # увеличиваем счетчик
    #----------------
    out = False # условие вывода
    find_me_old = find_me
    if i == (x-1): # проверка на последний элемент
       out = True
    elif arr_data[(i+1)].find(find_me) < 0: #проверка следующего элемента
       out = True
       find_me = arr_data[(i+1)] #замена элемента на новый
    #---------------
    # (№ 1) модуль условия вывода и сброса счетчика
    if out : 
       print(' Элемент = ', find_me_old, '! Итог = ', count_my)
       count_my = 0
    #--------------
#---

Проверьте отступы (нужны TAB, а не пробелы) после копирования кода — это же Питон.

Как резюме — ошибка может быть не только в программе, но в самом алгоритме.

 

Подпишитесь в VKontakte и Вы будете видеть новости сайта в ленте - нажмите кнопку -->>>
В группе уже 194

Вы можете сохранить ссылку на эту страницу себе на компьютер в виде htm файла




Пишите на электронную почту (тема и email будут добавлены автоматически в письмо)

В Вашем браузере должна быть настроена обработка ссылок mailto

site_post@bk.ru

или просто скопируйте адрес e-mail



Последние публикации

  • Статьи от: Автор
  • Рубрика: Блог
  • Сортировка: дата публикации по убыванию

Как выбрать регистратора доменов в 2022 году

14.06.2022
Публикация 2 недели назад
Простой вопрос. Выбираем подешевле - и вперед? Какая разница? Цена за регистрацию и за продление обычно разная Да, есть такое дело. Цена может отличаться в 4 раза. Срок регистрации для доменов в зоне .RU один год, первый год - дешево, потом дороже. Но это не является совсем уж ключевым параметром. Есть другая проблема - часть регистраторов занимается "продажей" услуг в нагрузку.  Добавление навязанных услуг в корзину - очень плохой вариант Невозможно купить нормально домен - смотрим примеры выбираем домен и добавляем его в корзину Упс, добавилась позиция за 89 руб.  Т.е. не просто добавили товар с нулевой стоимостью в рамках акции - а добавили то, что клиент не...
(Читать полностью...)

Приключение пробелов и TAB в html

11.12.2021
Публикация 7 месяцев назад
Крайне забавная тема. Вот они. Мнемоника - специальный синтаксис для указания символов в html коде. Читаем Мнемоники в HTML Символ пробела, ASCII / UNICOD код 32 В спецификации HTML сделана интересная схема отображения пробелов: несколько пробелов между символами отображается как один несколько пробелов до символа отображаются как один один пробел на пустой строке не отображается внутри тэгов <pre> показываются все пробелы Зачем это сделано? Для удобства редактирования кода html руками :) Вот пример кода в тегах <pre> <p><b> пример текста пример текста пример текста </b></p> данный текст отобразится как пример текста...
(Читать полностью...)

Используем PHP и псевдографику для простой гистограммы

05.12.2021
Публикация 7 месяцев назад
Вот такой вывод "гистограммы" на основе данных массива   Нет никаких графических библиотек, чистый PHP и символ псевдографики ▓ (ASCII 2593). Разная насыщенность: значение более 70% от размера ячейки значение менее полного размера ячейки нет значения - фон Для построения используется цифровой массив - могут быть положительные и отрицательные данные. Массив ниже - данные вначале более актуальные по времени, поэтому в коде используется реверс (что бы эти данные оказались справа на гистограмме) $arr_count = array (150,145,20,10,5,0,99,85,41,34,21,56,75,46,78,34,125,130,128,10,15,24,50,30,20,0,10,20,30,50,30,20,10,5,0,5,10,20,30,50,150,145); Да  - точность не особо...
(Читать полностью...)

В Debian 11 нет команды iptables

09.10.2021
Публикация 9 месяцев назад
При вводе команды iptables получаем “command not found”. Это  как? А вот так :) По умолчанию теперь есть nftables. Включена в ядро Linux, начиная с версии 3.13, выпущенной 19 января 2014 года. Является заменой четырех команд: iptables ip6tables arptables ebtables Базовых отличий два: в одной команде объедена работа с протоколами IPv4 и IPv6 теперь нет изначально созданных таблиц - нужно создавать самостоятельно Таблицы могут быть одного из 6-ти семейств (families): ip — для обработки пакетов IPv4 ip6 — IPv6 inet — обрабатывает сразу и IPv4 и IPv6 (чтобы не дублировать одинаковые правила) arp — пакеты протокола ARP bridge — пакеты, проходящие через мост netdev...
(Читать полностью...)

Использование тройного === в программировании (PHP)

05.05.2021
Публикация 1 год назад
Любопытный пример. Программисты знают, что есть несколько вариантов "равно": присваивание $a = 10 сравнение if ($a == $b) {........} тождественное сравнение if ($a === $b) {........} Если с первыми двумя вариантами достаточно понятно, то третий вариант вызывает вопросы.  Тождественно равно - должны совпадать не только значения, но и типы переменных. Основные типы в PHP: число $a = 10; строка $b = '10'; // кавычки показывают, что внутри строка логическая переменная $c = FALSE; И например, условие $a == $b будет верным, т.к. сравниваются значения и интерпретатор PHP "понимает", что это десять. А вот условие $a === $b будет ложным, т.к....
(Читать полностью...)

Переадресация с https на http

11.03.2021
Публикация 1 год назад
Зачем это нужно? Есть несколько причин:  у нас сайт в разработке, пока работает на http, но поисковые боты проверяют и протокол https (и делают заглушку основным "зеркалом"...) у нас сайт в процессе переезда на другой сервер, а сертификат SSL может выпускаться от 10 мин до 1 часа (если проверка по DNS) - а в поиске все страницы сайта выдаются в виде https://site.ru Нужно как-то и поисковым машинам сказать, что это временно. И посетителям сайта, которые в этот момент перейдут с поиска - тоже об этом сказать. Основная статья по перевода на HTTPS Как включить HTTPS на сайте? ВАЖНО: браузер проводит проверку наличия SSL-сертификата раньше (при запросе https), чем...
(Читать полностью...)

Чем отличается сервер VPS от VDS

07.02.2021
Публикация 1 год назад
В чем разница VPS/VDS? Хитрые хостеры отвечают, что это одно и то же. А вот не совсем: VPS - (англ. virtual private server) - виртуальный частный сервер VDS - (англ. virtual dedicated server) - виртуальный выделенный сервер Server - он конечно сервер, но разный. Одна буква P/D - и разница есть. Читаем статью про хостинг Хостинг VPS Самые низкие тарифы VPS – на виртуализации OpenVZ Читаем статью Как выбрать VPS/VDS по параметрам Вот именно OpenVZ - это как раз виртуальный частный сервер VPS. Точнее - это контейнер (причем для его работы требуется модифицированное ядро Linux - в отличии от Docker), а не сервер. Внутри контейнера можно запускать только те программы, которые...
(Читать полностью...)