0 / 0 / 0
Регистрация: 09.05.2020
Сообщений: 49

Найти слова, которые встречаются только один раз

11.10.2020, 16:54. Показов 10433. Ответов 29

Студворк — интернет-сервис помощи студентам
Дана последовательность слов, разделенных пробелами, в конце точка. Образовать новую ленту из слов, которые встречаются только один раз, в том порядке, в котором они встречаются.
Строку ввести самостоятельно

Добавлено через 38 минут
Словарь не использовать!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.10.2020, 16:54
Ответы с готовыми решениями:

Вывести только те буквы двух слов, которые встречаются в обоих словах только один раз
Добрый день! Помогите решить, пожалуйста. Задано два слова. Составить программу, которая определяет и выводит те буквы слов, которые...

Выбрать подпоследовательности которые встречаются только один раз
3. Из заданной символьной последовательности, состоящих из букв английского алфавита, выбрать лишь те, которые встречаются только ОДИН раз....

Вывести элементы списка, которые встречаются только один раз
Дан список. Выведите те его элементы, которые встречаются в списке только один раз. Элементы нужно выводить в том порядке, в котором они...

29
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
11.10.2020, 21:00
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Jordan2323 Посмотреть сообщение
Не запустился Ваш код
Чей код? Здесь куча вариантов. И каждый нужно запускать включив мозги, а не тупым копированием.
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
11.10.2020, 21:10
Jordan2323, А так?
Python
1
2
3
4
5
6
7
8
9
10
11
12
st = ' ' + input().strip().rstrip('.') + ' '
st1 = ''
i = 1
k = len(st)
while i < k :
    end = st[i:].find(' ') + 1
    temp = st[i-1:end + i]
    if temp not in st[:i-1] + st[end+i-1:]  :
        st1 += temp.strip() + ' '
        temp = ''
    i += end
print(st1.strip())
temp -> очередное слово с двух сторон пробелы, чтобы различать символьно, например, "сто" и "стол"
или по условию - слова разделены пробелами

Добавлено через 9 минут
Возможна ловушка с несколькими пробелами подряд. Тогда
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
st = ' ' + input().strip().rstrip('.') + ' '
st1 = ''
i = 1
while '  ' in st :
    st = st.replace('  ',' ')
k = len(st)
while i < k :
    end = st[i:].find(' ') + 1
    temp = st[i-1:end + i]    
    if temp not in st[:i-1] + st[end+i-1:]  :
        st1 += temp.strip() + ' '
        temp = ''
    i += end
print(st1.strip())
0
0 / 0 / 0
Регистрация: 09.05.2020
Сообщений: 49
12.10.2020, 13:26  [ТС]
Gdez, И объясните как работает Ваш цыкл пожалуйста!!
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
12.10.2020, 13:48
Лучший ответ Сообщение было отмечено Jordan2323 как решение

Решение

Jordan2323,
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
st = ' ' + input().strip().rstrip('.') + ' '
st1 = ''
i = 1
# цикл удаления двойных (тройных и тд) пробелов с заменой их на одиночные
while '  ' in st :
    st = st.replace('  ',' ')
 
k = len(st)
while i < k :
 
# поиск индекса очередного пробела в срезе [i:]. Ответ - число относительно "i".
# для find - если в срезе [6:] искомое на 5-м месте (или для исходной строки на 11- м)
# то ответ будет 4
    end = st[i:].find(' ') + 1
 
# Берется очередное слово с пробелом впереди (его индекс = i - 1) и в конце (его индекс = end + i)
    temp = st[i-1:end + i]    
 
# st[:i-1] + st[end+i-1:] - из исходной строки "вырезан" фрагмент st[i-1:end+1] = temp
# условие - если temp'a нет в строке с "вырезом", то добавляем temp в результат (st1),
# предварительно убрав все пробелы и добавив один пробел в конец строки st1
    if temp not in st[:i-1] + st[end+i-1:]  :
        st1 += temp.strip() + ' '
 
# "обнуляем" temp
        temp = ''
 
# перемещаем счетчик на длину temp
    i += end
print(st1.strip())
1
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
12.10.2020, 13:50
Gdez,
У всех наших вариантов есть проблема: ни один код не работает для перемешанных строк.

'Trixie is Trixie best pony best pony pony best'

Твой последний пример выдает это:
'is'

Мой вариант выдает:
'is Trixie pony'


То есть чисто строковыми методами нельзя добиться извлечения слов-одиночек.
Нужен или контейнер или подсчет.
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
12.10.2020, 13:56
Garry Galler, "встречаются один раз"

Добавлено через 1 минуту
Всего. Во всей строке, а не подряд
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
12.10.2020, 14:02
Цитата Сообщение от Gdez Посмотреть сообщение
Всего. Во всей строке, а не подряд
А, да все верно :-) Это я стал усложнять строку и не в ту строну свернул.
Тогда получается неверно такие повторы обрабатывает только мой вариант с find.

Твой вариант я так понял смотрит не только вперед, но и назад. Поэтому повторов нет.
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
12.10.2020, 14:18
Да.
Но очень помогла подсказка с find
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
12.10.2020, 16:57
Добавил просмотр назад. Теперь нормально. Флаг debug позволяет посмотреть ход вычислений.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def finduniq33(text, debug=False):
    if debug:
        print(f"{'Слово':11}|{'start':5}|{'end':5}|{'lookahead':10}|{'lookbehind':10}|{'result'}")
    
    text = text.strip(" ") 
    result = ""
    start, end= 0,0 
    while end !=-1 :
        # выделяем слово
        end = text.find(" ", start)
        if end == -1: 
            word = text[start:]
        else:
            word = text[start:end]
        # избавляем код от дополнительных просмотров из-за следующих друг за другом пробелов
        if word == "":
            start = end + 1    
            continue
            
        lookahead = text.find(word, start + len(word) + 1)   # просмотр вперед
        lookbehind = text.find(word, 0, start if start == 0 else start - 1 ) # просмотр назад
        # ищем вхождение слова слева и справа; 
        if  lookbehind == -1 and lookahead == -1: 
            result += " " + word
        
        if debug:
            print(f"<{word+'>':10}|{start:5}|{end:5}|{lookahead:10}|{lookbehind:10}|{result}")
        
        start = end + 1
        
    return result.strip()
Python
1
finduniq33('Trixie is  best  pony  pony  pony in the world  ', debug=True)
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Слово      |start|end  |lookahead |lookbehind|result
<Trixie>   |    0|    6|        -1|        -1| Trixie
<is>       |    7|    9|        -1|        -1| Trixie is
<>         |   10|   10|        11|         0| Trixie is
<best>     |   11|   15|        -1|        -1| Trixie is best
<>         |   16|   16|        17|         0| Trixie is best
<pony>     |   17|   21|        23|        -1| Trixie is best
<>         |   22|   22|        23|         0| Trixie is best
<pony>     |   23|   27|        29|        17| Trixie is best
<>         |   28|   28|        29|         0| Trixie is best
<pony>     |   29|   33|        -1|        17| Trixie is best
<in>       |   34|   36|        -1|        -1| Trixie is best in
<the>      |   37|   40|        -1|        -1| Trixie is best in the
<world>    |   41|   -1|        -1|        -1| Trixie is best in the world
 
'Trixie is best in the world'
Python
1
finduniq33('Trixie is  Trixie best  pony best  pony     pony best', debug=True)
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Слово      |start|end  |lookahead |lookbehind|result
<Trixie>   |    0|    6|        11|        -1|
<is>       |    7|    9|        -1|        -1| is
<>         |   10|   10|        11|         0| is
<Trixie>   |   11|   17|        -1|         0| is
<best>     |   18|   22|        29|        -1| is
<>         |   23|   23|        24|         0| is
<pony>     |   24|   28|        35|        -1| is
<best>     |   29|   33|        49|        18| is
<>         |   34|   34|        35|         0| is
<pony>     |   35|   39|        44|        24| is
<>         |   40|   40|        41|         0| is
<>         |   41|   41|        42|         0| is
<>         |   42|   42|        43|         0| is
<>         |   43|   43|        44|         0| is
<pony>     |   44|   48|        -1|        24| is
<best>     |   49|   -1|        -1|        18| is
 
'is'
Работает все равно быстрее всех прочих вариантов. 18 ms на 10 тыс повторах слов.

P.S. Добавил проверку на пустые слова, чтобы сократить число просмотров из-за множественных пробелов.
0
13.10.2020, 06:05

Не по теме:

ещё чуть-чуть и вы регулярки изобретёте

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.10.2020, 06:05

Из строки выбрать те символы, которые встречаются в ней только один раз
Из заданной символьной строки выбрать те символы, которые встречаются в ней только один раз, в том порядке, в котором они встречаются в...

Выбрать из файлы символы, которые встречаются в нем только один раз
дан текстовый файл, содержащий текст на русском языке. Выбрать из него только те символы, которые встречаются в нем только один раз, в...

Распечатайте только те значения элементов массива, которые встречаются в нем ровно один раз
Помогите пожалуйста решить задачу: На вход программе сначала подается значение n 100 — количество элементов в массиве. В следующей...

Создать список в который поместить те символы из my_str, которые встречаются в строке только один раз
Привет всем) Спасибо за помощь Условие : Дана строка my_str. Создать список в который поместить те символы из my_str, которые...

Вывести все символы, которые встречаются в строке только один раз, в порядке возрастания их ASCII-кодов.
Напишите программу, которая находит все символы в символьной строке, которые встречаются только один раз. Входные данные На вход...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru