Уведомления

Группа в Telegram: @pythonsu

#1 Май 30, 2019 13:38:55

zantal
Зарегистрирован: 2019-04-16
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помочь с маленькой задачкой

Уважаемые коллеги!
Столкнулся с одной проблемой при решении задачи.
Условие:
“Дан список чисел. Посчитайте, сколько в нём пар элементов, равных друг другу. Считается, что любые два элемента, равные друг другу, образуют одну пару, которую необходимо посчитать”.
Нужно решить используя знания о списках.

Для входных данных 1 1 1 1 1 ответ 10
Для входных данных 3 2 1 2 2 4 3 2 5 3 2 ответ 13.

Вот моё решение:

a =
x = 0
for i in a:
if a.count(i) > 1:
x += a.count(i) - 1
a.remove(i)
print(x)

Но почему, то для первого варианта программа выдает ответ 9. Почему так?
Ведь для 1 1 1 1 1 выражение a.count(i) будет равно 5, и, соответственно, ввиду того что в цикле for мы постепенно удаляем 1 элемент из списке (a.remove) получается должен быть равен x = 4+3+2+1 = 10. А программа выдаёт 9.
Помогите, пожалуйста.



Отредактировано zantal (Май 30, 2019 13:44:48)

Офлайн

#2 Май 30, 2019 13:40:02

zantal
Зарегистрирован: 2019-04-16
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помочь с маленькой задачкой

первая строка - это “Список”. Просто почему-то не отобразился

Отредактировано zantal (Май 30, 2019 13:44:22)

Офлайн

#3 Май 30, 2019 14:36:45

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Прошу помочь с маленькой задачкой

код на форумах, в чатах и тп надо оборачивать в теги code. Поправьте ваше сообщение.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Май 30, 2019 14:47:15

Egorro13
Зарегистрирован: 2019-04-16
Сообщения: 105
Репутация: +  5  -
Профиль  

Прошу помочь с маленькой задачкой

zantal
Ведь для 1 1 1 1 1 выражение a.count(i) будет равно 5, и, соответственно, ввиду того что в цикле for мы постепенно удаляем 1 элемент из списке (a.remove) получается должен быть равен x = 4+3+2+1 = 10. А программа выдаёт 9.
Я так понимаю, что дело в удалении элементов итерируемой коллекции в процессе итерации, для наглядности переделал код:
 a = list(map(int, "1 2 3 4 5".split(" ")))
for i in a:
    print(a, ", deleting:", i)
    a.remove(i)
Т.е. после удаления первого элемента метод next у итератора все равно возвращает второй элемент, а не тот, который был вторым до удаления, и т.д. до конца

Офлайн

#5 Май 30, 2019 14:48:33

zantal
Зарегистрирован: 2019-04-16
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помочь с маленькой задачкой

Ок, спасибо.
Вот код:

a = [int(s) for s in input().split()]
x = 0
for i in a:
if a.count(i) > 1:
x += a.count(i) - 1
a.remove(i)
print(x)

Офлайн

#6 Май 31, 2019 09:30:21

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

Прошу помочь с маленькой задачкой

zantal
Вот код:
Используй
while lst
и
lst.pop()

  
>>> def count_pairs(lst):
...     out = 0
...     tmp = lst[:]
...     while tmp:
...         out += tmp.count(tmp.pop())
...     return out
... 
>>> count_pairs([1, 1, 1, 1, 1]) == 10
True
>>> count_pairs([3, 2, 1, 2, 2, 4, 3, 2, 5, 3, 2]) == 13
True
>>>



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version