Найти повторяющиеся значения списка
Задание следующее:
Напишите программу, которая принимает на вход список чисел в одной строке и выводит на экран в одну строку значения, которые встречаются в нём более одного раза.
Для решения задачи может пригодиться метод sort списка.
Выводимые числа не должны повторяться, порядок их вывода может быть произвольным.
Вот мое решение:
s = [int(i) for i in input().split()]
s.sort()
cnt = 1
l = len(s)
for i in range(l-2):
if s[i] == s[i + 1] and s[i + 1] != s[i + 2]:
cnt += 1
if cnt > 1:
print(s[i], end=" ")
cnt = 1
Программа работает на примере "4 8 0 3 4 2 0 3", выводит "0 3 4". Если ввести одно число, то тоже работает (то есть ничего не выводит, так и должно быть).
Но если ввести "1 1 2 2 3 3", то выводит "1 2", хотя должно быть "1 2 3". Или если ввести "1 1 1 1 1 2 2 2", то выводит "1", хотя должно быть "1 2".
Объясните, пожалуйста, что не так?
PS set и count желательно не использовать, так как задача обучающая, и до этого еще не дошли.
Ответы (4 шт):
Простой вариант исправления - добавляем также проверку на достижение конца строки (оценивается раньше использования индекса!)
for i in range(l-1):
if i == l-2 or s[i + 1] != s[i + 2]:
if s[i] == s[i + 1]:
print(s[i], end=" ")
способ 1:
arr = list(map(int, input().split()))
res = [i for i in set(arr) if arr.count(i) > 1]
print(*res)
способ 1.5:
arr = list(map(int, input().split()))
res = set(filter(lambda i: arr.count(i) > 1, arr))
print(*res)
cпособ 2:
arr = sorted(list(map(int, input().split())))
res = [arr[i] for i in range(len(arr) - 1) if arr[i] == arr[i+1] and (i == 0 or arr[i] != arr[i-1])]
print(*res)
способ 3:
arr = list(map(int, input().split()))
res = [arr[i] for i in range(len(arr)) if arr[i] not in arr[:i] and arr[i] in arr[i+1:]]
print(*res)
тут результат не отсортирован, но если требуется - можно или arr или res отсортировать
можно и без set, и без count (до которых вы еще не дошли), и без... сортировки, а используя словарь для подсчета количества повторов каждого числа в списке:
numbers = [int(i) for i in input().split()]
nums_counter = dict()
for n in numbers:
nums_counter[n] = nums_counter.get(n, 0) + 1
при исходном "4 8 0 3 4 2 0 3", в nums_counter будет следующее:
{0: 2, 2: 1, 3: 2, 4: 2, 8: 1}
и вывести на печать те, что есть в исходном больше 1-го раза:
for k, v in nums_counter.items():
if v > 1:
print(k, end=' ')
в итоге:
0 3 4
ps
для 1 1 2 2 3 3 вывод - 1 2 3
для 1 1 1 1 1 2 2 2 вывод - 1 2
Я написал так:
s = [int(i) for i in input().split()]
s.sort()
a = []
ss = 0
c = 0
for i in s:
if ss == 0:
k = i
ss = 1
if c == 0:
c += 1
continue
if k == kk:
a.append(i)
else:
kk = i
ss = 0
if kk == k:
a.append(i)
for i in a:
print(i)
Для заданных значений работает, но можно и короче, если подумать