Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/202: Рейтинг темы: голосов - 202, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 31.01.2019
Сообщений: 2

Выписать все слова, которые являются анаграммами друг для друга

31.01.2019, 17:29. Показов 46837. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Анагра́мма (от греч. ανα- — «пере» и γράμμα — «буква») — литературный приём, состоящий в перестановке букв или звуков определённого слова (или словосочетания), что в результате даёт другое слово или словосочетание (Википедия).

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

Формат ввода
В первой строке идёт целое число n (1 ≤ n ≤ 100 000), количество исходных слов.

Далее следует n слов, по одному слову в строке, слова могут идти в разном регистре!

Формат вывода
В одной строке должны идти слова, которые являются анаграммами друг для друга, в нижнем регистре, через пробел. Порядок слов — лексикографический (как в словаре). Порядок строк так же лексикографический.

Пример
Ввод
Code
1
2
3
4
5
6
7
8
9
10
11
12
11
окорок
петлей
Плетей
рококо
теплей
Тишь
ТОМНО
тонко
тонок
тоном
шить
Вывод:
Code
1
2
3
4
5
окорок рококо
петлей плетей теплей
тишь шить
томно тоном
тонко тонок
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.01.2019, 17:29
Ответы с готовыми решениями:

Найти слова, которые являются анаграммами друг для друга
Анагра́мма (от греч. ανα- — «пере» и γράμμα — «буква») — литературный приём, состоящий в перестановке букв или звуков определённого слова...

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

Как выписать слова после чисел отдельно друг от друга?
вот есть такой пример 33176 LEONID / 17, MAYA / 1.5 и мне надо чтобы получилось так 33176 LEONID / 17 33176 MAYA / 1.5

10
 Аватар для __ALPHA__
302 / 160 / 87
Регистрация: 16.04.2018
Сообщений: 239
02.02.2019, 17:44
Лучший ответ Сообщение было отмечено dhsakdhsajk как решение

Решение

Вроде работает:
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
32
33
34
35
36
37
#Функция проверяет являются ли слова
#word1 и word2 анаграммами
def test(word1, word2):
    a1 = list(word1)
    a2 = list(word2)
    if set(a1) == set(a2):
        return True
    else:
        return False
 
#Ввод n
n = int(input())
 
#Ввод слов
words = []
for _ in range(n):
    word = input().lower()
    if not word in words:
        words.append(word)
 
#Сортировка слов как в словаре
words = sorted(words, key=lambda w: w)
 
while len(words) > 0:
    w = [words.pop(0)]
 
    k = 0
    while k < len(words):
        word2 = words[k]
 
        if test(w[0], word2):
            w.append(word2)
            words.remove(word2)
        else:
            k += 1
 
    if len(w) > 1: print(*w)
2
 Аватар для Semen-Semenich
5220 / 3468 / 1172
Регистрация: 21.03.2016
Сообщений: 8,293
02.02.2019, 18:25
__ALPHA__, немного поправки. строку тоже можно привести к множеству так что функцию можно упростить

Python
1
2
def test(word1, word2):
    return set(word1) == set(word2):
но это не совсем то что нужно
Python
1
2
3
4
5
>>> a = 'окорок'
>>> b = 'рок'
>>> set(a) == set(b)
True
>>>
как видно множества одинаковы но анагра́ммы не получится, лишние буквы остаются
наверно лучше так
Python
1
2
def test(word1, word2):
    return sorted(word1) == sorted(word2)
тогда
Python
1
2
3
4
5
6
7
8
9
>>> a = 'окорок'
>>> b = 'рок'
>>> sorted(a) == sorted(b)
False
>>> a = 'окорок'
>>> b = 'рококо'
>>> sorted(a) == sorted(b)
True
>>>
2
0 / 0 / 0
Регистрация: 31.01.2019
Сообщений: 2
03.02.2019, 10:43  [ТС]
ну по моему сравнивать массивы поэлементно лучше всего так:
Python
1
2
def test(a, b):
    return len(a) == len(b) and all(t in b for t in a)
так получается гораздо быстрее:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
In [3]: %timeit test("jhdsajkdas", "ghjalkskdsad;lasjdklsajdklsajlhfaks89")
The slowest run took 37.60 times longer than the fastest. This could mean that an intermediate result is being cached.
10000000 loops, best of 3: 133 ns per loop
 
In [4]: %timeit test1("jhdsajkdas", "ghjalkskdsad;lasjdklsajdklsajlhfaks89")
The slowest run took 8.96 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 3.11 µs per loop
 
In [8]: %timeit test("jhdsajkdas", "hdsakjdasj")
The slowest run took 8.85 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 808 ns per loop
 
In [9]: %timeit test1("jhdsajkdas", "hdsakjdasj")
The slowest run took 5.23 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 1.32 µs per loop
Добавлено через 8 минут
и здесь
Python
1
words = sorted(words, key=lambda w: w)
лямбда не нужна, сортед и так сортирует по значению. возможно, вы имели в виду w.lower()
0
0 / 0 / 0
Регистрация: 06.11.2018
Сообщений: 12
23.03.2019, 14:09
Цитата Сообщение от __ALPHA__ Посмотреть сообщение
Вроде работает:
На больших объёмах выполняется очень долго.
Пробовал разные варианты test(a,b) - не помогло

Понял что основное время затрачивается на часть
Python
1
2
3
4
5
6
7
8
while k < len(words):
        word2 = words[k]
 
        if test(w[0], word2):
            w.append(word2)
            words.remove(word2)
        else:
            k += 1
Попробовал через цикл For in range
Но почему-то конструкция k-=1 чтобы обойти уменьшение размера words.remove(word2) не влияет на сам цикл и k не уменьшается.
Python
1
2
3
4
5
6
7
8
9
10
11
12
while len(words) > 0:
    w = [words.pop(0)]
    # k = 0
 
    for k in range(len(words)):
        word2 = words[k]
        if test(w[0], word2):
            w.append(word2)
            words.remove(word2)
            k -= 1
        # else:
        #     k += 1
Есть ли другой путь уменьшить время выполнения задания?
0
-5 / 10 / 0
Регистрация: 14.03.2019
Сообщений: 52
28.03.2019, 21:27
Realdreamer, Здравствуйте вы решили эту проблему?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
28.03.2019, 23:22
Цитата Сообщение от Realdreamer Посмотреть сообщение
Но почему-то конструкция k-=1 чтобы обойти уменьшение размера words.remove(word2) не влияет на сам цикл и k не уменьшается.
Потому что переменную цикла for нельзя изменять (это бессмысленно). Читайте внимательнее документацию языка.
Кроме того пытаться удалять значения из списка во время forward итерации очень глупо. Нужно делать baсkward итерацию (с конца).
0
0 / 0 / 0
Регистрация: 06.11.2018
Сообщений: 12
04.04.2019, 08:18
Цитата Сообщение от Garry Galler Посмотреть сообщение
Потому что переменную цикла for нельзя изменять (это бессмысленно). Читайте внимательнее документацию языка.
Кроме того пытаться удалять значения из списка во время forward итерации очень глупо. Нужно делать baсkward итерацию (с конца).
Спасибо за наводку коллега - будем изучать ))
Про обратную итерацию не слышал до этого.
0
69 / 61 / 11
Регистрация: 08.04.2019
Сообщений: 117
08.04.2019, 19:02
Python
1
2
3
4
5
6
7
8
9
a = {}
n = int(input())
for i in range(n):
    s = input().lower()
    sort_line = ''.join(sorted(s))
    a[sort_line] = a.get(sort_line, set())
    a[sort_line].add(s)
new_words = [' '.join(sorted(i)) for i in a.values() if len(i) > 1]
print('\n'.join(sorted(new_words)))
3
0 / 0 / 0
Регистрация: 15.03.2021
Сообщений: 2
15.03.2021, 15:03
Привет, можешь объяснить как работает этот код, заранее спасибо!
0
12 / 11 / 3
Регистрация: 04.11.2024
Сообщений: 101
20.02.2025, 20:59
Python
1
2
3
4
5
6
7
8
9
10
11
12
arr = []
d1 = {}
for i in range(n := int(input())):
    arr.append(s := input().lower())
    d = "".join(sorted(s))
    if d in d1:
        d1[d].append(s)
    else:
        d1[d] = [s]
for j in sorted(list(d1.keys()), key=lambda x: sorted(d1[x])[0]):
    if len(set(d1[j])) > 1:
        print(*sorted(list(set(d1[j]))))
Не быстро, но читаемо
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.02.2025, 20:59
Помогаю со студенческими работами здесь

Вывести слова, которые являются анаграммами, палиндромами
Помогите пожалуйста с анаграммами и палиндромами, полное задание: Пользователь вводит предложение Создайте меню и методы для...

Нахождение пары слов, которые являются отражением друг друга (нужны комментарии)
Я так поняла программа находит пары слов которые являются отражением друг друга Мне дали код package javaapplication24; import...

Как отделить два слитных слова(которые выбрались из файла через регулярное выражение) друг от друга для вывода в форму?
private void button1_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.OK) { ...

Дана строка, указать те слова, которые содержат хотя бы одну букву «k». Считать, что слова в тексте отделены друг от друга одним пробелом
Дана строка, указать те слова, которые содержат хотя бы одну букву «k». Считать, что слова в тексте отделены друг от друга одним пробелом.

Дана строка символов. Удалить из нее все слова нечетной длины. Слова отделяются друг от друга одним пробелом
Дана строка символов. Удалить из нее все слова нечетной длины. Слова отделяются друг от друга одним пробелом. Помогите сделать код на C....


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru