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, а не пробелы) после копирования кода — это же Питон.

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

 


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



Вы будете видеть наш сайт у себя в ленте


Нажмите "Подписаться"


Нажмите "Нравится" или напишите сообщение



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

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

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

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

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

05.12.2021
Публикация 2 месяца назад
Вот такой вывод "гистограммы" на основе данных массива   Нет никаких графических библиотек, чистый 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
Публикация 4 месяца назад
При вводе команды 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
Публикация 9 месяцев назад
Любопытный пример. Программисты знают, что есть несколько вариантов "равно": присваивание $a = 10 сравнение if ($a == $b) {........} тождественное сравнение if ($a === $b) {........} Если с первыми двумя вариантами достаточно понятно, то третий вариант вызывает вопросы.  Тождественно равно - должны совпадать не только значения, но и типы переменных. Основные типы в PHP: число $a = 10; строка $b = '10'; // кавычки показывают, что внутри строка логическая переменная $c = FALSE; И например, условие $a == $b будет верным, т.к. сравниваются значения и интерпретатор PHP "понимает", что это десять. А вот условие...
(Читать полностью...)

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

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

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

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

Что выбрать HDD или SSD у хостера?

08.12.2020
Публикация 1 год назад
Простой вопрос HDD vs SSD Казалось бы - что тут выбирать? Каждый, кто менял в своей Windows 7 на старом ПК диск HDD на SSD = радовался увеличению быстродействия системы. SSD - быстрее: нет механических систем да и электроны быстрее по микросхемам бегают Но у хостера - не домашний ПК, там сервер. И диски не по отдельности, а соединены в RAID-массив. Некоторые хостеры предлагаю очень простой выбор У некоторых выбор посложнее: SAS или...
(Читать полностью...)