Как исправить код в задаче на python, чтобы он корректно работал?
Вот сама задача: напишите программу, которая принимает на вход список чисел в одной строке и выводит на экран в одну строку значения, которые встречаются в нём более одного раза.Для решения задачи может пригодиться метод sort списка. Проблема заключается в том, что я написал программу (вроде) и она вполне себе работает но данные на выходе должны быть отсортированы по возрастанию, а как это сделать я не совсем понимаю... Надо как-то передать значения из х в новый список, отсортировать его и вывести результат...
данные для проверки:
Sample Input 1:
4 8 0 3 4 2 0 3
Sample Output 1:
0 3 4
Мой код:
s = [ int(i) for i in input().split()]
ordered_s = sorted(s)
from collections import Counter
c = Counter(s)
for x in c:
if c[x] > 1:
print (x)
o5a, да я вот не понимаю, зачем допустим Counter. Лишняя трата ресурсов, считать и использовать полное кол-во всех элементов. Хотя выходит и count не сильно подходит, и нужен немного иной подход...
MinTnt, то, что не нужно все подряд приводить к int(), а только отобранные, в целом разумно. Но зависит от количества элементов. В целях оптимизации конечно лучше. Но тогда уж в целях оптимизации (раз делаем проверку ... in ....) не стоит и использовать список в качестве хранения найденных, а перейти на множество.
И по-моему у Вас какая-то одержимость однострочниками. То, что так можно записать, не значит, что стоит несколько циклов лепить в один. Читаемость хуже. Вот то же самое, написанное обычными циклами, но читается имхо заметно лучше:
a = []
cache = set()
for x in l.split():
if x in cache:
a.append(int(x))
else:
cache.add(x)
a.sort()
print(a)
Кстати из-за использования списка вместо словаря в случае Counter() Ваш вариант даже медленнее получится на достаточно большом количестве чисел последовательности, несмотря на его использование int() изначально.
для этой задачи как по меня вернее отталкиваться не от количества в целом, а конкретно от того, больше или меньше определенного числа
Да, это логичнее.
Кстати, я сразу не обратил внимание, но Ваш вариант (и развернутый мной из него через циклы) не учитывает уникальность конечного списка. Если числа повторяются более 2 раз, то они будут дублироваться в результате. Так что туда еще все равно придется добавлять: или проверки на кол-во или переделать конечный список тоже на множество.
MinTnt, Прочитайте , пожалуйста, повнимательнее условия задачи. Должна быть обязательно строка ввода, которая считывает входные данные, т.е Input() . В вашем же случае вы сразу присваиваете определенные значения переменной. В любом случае, спасибо за отклик и проявленную активность.
Алан Гибизов и вот как на это реагировать. Мы выше описали, что весь код можно ускорить и оптимизировать, так как текущий варянт с Counter не до конца является верным.
А он пишет, что код не подходит, так как нету input()
MinTnt, Не судите строго, изучаю python 5-ый день с 0. Для меня любое отклонение от условий задачи критично т.к разобраться становиться гораздо сложнее. И хотелось рассмотреть именно возможность реализации задачи через метод со списками и Counter. Я понимаю прекрасно что есть и альтернативные варианты.
MinTnt, вспоминая себя на 5-й день изучения Python, не удивляюсь. Не было никакого понимания объектной модели языка и скобочки были просто скобочками. Илья, если вы действительно Учите Python, и хотите серьезно его понять, послушайте опытных и учите по книге. Это долго, нудно, трудно. Но это просто бомба по сравнению с «курсами».
Попробовал вот этот код, к сожалению формат вывода отличается от требуемого:
s = input().split()
ordered_s = sorted(s, key = int)
from collections import Counter
c = Counter(ordered_s)
for x in c:
print ([x for x in c if c[x]>1]) input 1: 4 8 0 3 4 2 0 3 output 1:
0 3 4
0 3 4
0 3 4
0 3 4
0 3 4
s = [ int(i) for i in input().split()]
t = []
s.sort()
l = len(s)-1
k = 100000
if len(s)!=1:
for i in range(0,l):
if s[i]==s[i+1] and s[i]!=k:
t.append(s[i])
k=s[i]
for j in range(l,l+1):
if s[-1]==s[-2] and s[j]!=k:
t.append(s[j])
n = len(t)
for g in range(0,n):
print(t[g],end=' ')