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 - нажмите кнопку
Подпишитесь в Telegram - нажмите кнопку
Наша группа ODNOKLASSNIKI

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




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

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

site_post@bk.ru

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



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

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

Яндекс Metrika добавила кнопку на фронтенд

05.08.2022
Публикация 2 месяца назад
На сайтах появилась новая кнопка Вот она - маленькая, круглая справа внизу, рядом с кнопкой "Наверх" При нажатии появляется статистика Яндекс.Метрика. Вообще это некрасиво. Счетчик должен считать - а не добавлять что-то на сайт.  Скрипт, которые Вы установили на сайт для подсчета посетителей - начал что-то добавлять на фронтенде Вашего сайта - и Вас никто не спрашивал. Да - конечно, статистика показывается только владельцу счетчика (т.е. он зарегистрирован в текущей сессии в Яндексе под своим логином). Модуль статистики на сайте Показывать статистику прямо на сайте для владельца счетчика. Статистика будет отображаться только при условиях: ваш браузер...
(Читать полностью...)

Пароль для внешних приложений mail.ru

10.07.2022
Публикация 3 месяца назад
Упс... А что случилось? Пришло письмо на почту. А что это? А это Вы используется сервер SMTP Вашего почтового ящика от mail.ru на своем сайте - и он перестал работать :( Читаем статью  Как отправить e-mail с сайта? И теперь всё перестало работать - где-то с июня 2022 г. Почта mail.ru ввела дополнительную защиту аккаунта Теперь Ваш пароль от почтового ящика работает только для Вас. Для входа в аккаунт и для использования почты. Если Вы хотите использовать сервер SMTP для отправки почты с сайта - Вам теперь нужен отдельный пароль для приложений. Если враги его узнают - они не получат доступа к аккаунту,  с его помощью можно только получать и оправлять письма с помощью...
(Читать полностью...)

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

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

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

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

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

05.12.2021
Публикация 10 месяцев назад
Вот такой вывод "гистограммы" на основе данных массива   Нет никаких графических библиотек, чистый 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
Публикация 12 месяцев назад
При вводе команды 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 будет ложным, т.к....
(Читать полностью...)

X

    Please prove you are human by selecting the Car.