Форум сайта python.su
Всем привет!
Дан список в файле, состоящий из одной строки, без знака переноса строки (\n): ‘one two one tho three’
Необходимо вывести число предыдущих (предшествующих i-му местоположению каждого слова в строке) повторений для каждого слова. Ответ должен получиться такой: 0 0 1 0 0. Сразу скажу, что при проверке на сервере тесты вводят и по 10, и по 20 строк со словами. Это единичный пример.
Так вот, такой ответ получается, но только в том случае, если в вводном файле добавить пустую строку и соответственно знак ее переноса после строки с вводными словами. Я добавил множество ‘cl’ с перечнем знаков-разделителей слов (в задаче таковыми считаются пробелы, двойные пробелы и знаки переноса строки). Но я не нашел в и-нете, как обозначается конец строки, чтобы дать команду программе, при ее обнаружении, перейти к следующему этапу выполнения. Dubugger показывает, что программа выполняется до последнего символа в строке и тупо прерывается. Может, есть вообще альтернативные способы?
fInp = open('input.txt', 'r', encoding='utf8') word = [] tc = 0 lWords = [] cl = {'\n', ' ', ' '} for line in fInp: for char in line: if char not in cl: word.append(char) else: t = ''.join(word) c = 0 for i in range(tc): if t == lWords[i]: c += 1 print(c, end=' ') lWords.append(t) tc += 1 word = []
Офлайн
kamikadze
Если у вас “Дан список в файле, состоящий из одной строки, без знака переноса строки (\n)”, то когда вы сделаете
s = fInp.read()
вы получите переменную, которая содержит строку. Никакой символ конца строки вам не нужен.
Офлайн
Точно! И как я забыл про ‘.readline’?
Ну, в любом случае, спасибо! И, вот, сделал со “сплитом” и конкатенацией списков. Тоже выглядит приемлемо, вроде. Интересно, что в предыдущем варианте, если не учитывать проблему с ‘\n’, код проходит аж до 75 теста. А в текущем варианте - только до 5.
fInp = open('input.txt', 'r', encoding='utf8') lWords = [] for line in fInp: tl = list(line.strip().split()) lWords += tl for i in range(len(lWords)): c = 0 for j in range(i - 1): if lWords[i] == lWords[j]: c += 1 print(c, end=' ')
Отредактировано kamikadze (Фев. 9, 2018 06:34:27)
Офлайн
kamikadzeАлгоритм у вас мягко говоря не очень, попробуйте вот так
Интересно, что в предыдущем варианте, если не учитывать проблему с ‘\n’, код проходит аж до 75 теста. А в текущем варианте - только до 5.
s = "one two one tho three four one one" words = s.split() repeats = {} for w in words: if w not in repeats: repeats[w] = 0 else: repeats[w] += 1 print(repeats[w])
Офлайн
Сделал вот так, все прошло!
inf = open('input.txt', 'r', encoding='utf8') count = {} for line in inf: words = line.strip().split() for word in words: count[word] = count.get(word, 0) + 1 print(count[word] - 1, end=" ")
Офлайн