Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.54/48: Рейтинг темы: голосов - 48, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 09.05.2020
Сообщений: 49

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

11.10.2020, 16:54. Показов 10384. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru