Найти - Пользователи
Полная версия: Словари.
Начало » Центр помощи » Словари.
1
Dorum
Добрый день!
Условие:
Дан текст. Выведите слово, которое в этом тексте встречается чаще всего.
Решение:
 tekst = input("Введите текст: ") #Набор слов через пробел. Например, огурец помидор огурец перец
l = tekst.split(" ")
l1 = []
print(l)
for i in l:
     l1.append(l.count(i))
d = dict(zip(l, l1))
print(d)
for key in d.keys():
    if all(d.get(key) == 1 for key in d.keys()):
        print("В тексте отсуствуют повторяющиеся слова.")
    elif d.get(key) >= 2:
        print(key)
У меня несколько вопросов по моему решению задачи:
1) Я только-только открыл для себя функцию “all”. Можно ли и как избежать двойного дублирования цикла?
 for key in d.keys():
    if all(d.get(key) == 1 for key in d.keys()):
2) В случае, если выполняется условие:
    if all(d.get(key) == 1 for key in d.keys()):
        print("В тексте отсуствуют повторяющиееся слова.")
Как, собственно, вывести print единожды? То есть, чтобы не было дублирования print при каждом элементе равному 1.

3) Как бы Вы решили эту задачу?

Заранее спасибо.
py.user.next
Dorum
3) Как бы Вы решили эту задачу?
Через collections.Counter(), сейчас его, вроде, ускорили до приличного уровня, раньше же он работал в 17 раз медленнее обычного словарного включения.
Тут проблема только в том, что надо сначала слова из текста выделить. В живом тексте понятие слова не такое простое, как кажется поначалу, так как бывают цифры в словах, бывают дефисы и другие символы. Слово в кавычках может считаться словом вместе с кавычками (если деление слов по пробелам идёт), а может считаться словом только часть внутри кавычек.

  
>>> import collections
>>> 
>>> text = 'abc def abc def abc'
>>> 
>>> c = collections.Counter(text.split())
>>> max(c, key=lambda i: c[i])
'abc'
>>>

Dorum
Я только-только открыл для себя функцию “all”.
Функции all() и any() - это просто функции, которые сами по себе ничего не значат.
Для этой задачи сложно даже найти им применение.
Dorum
py.user.next
Функции all() и any() - это просто функции, которые сами по себе ничего не значат.
Для этой задачи сложно даже найти им применение.
С помощью этой функции я пытался найти ответ на вопрос: Если все слова не повторялись больше одного раза в тексте, то вывести print(). То есть, если все значения в словаре равны 1, то print(“В тексте нет повторяющихся слов.”)

P.S Касаемо Вашего решения. Меня интересует путь решения через словарь. Забыл упомянуть.
FishHook
Dorum
Меня интересует путь решения через словарь
Вам бы стоило почитать о словарях в питоне, судя по коду вы не очень понимаете как с ними работать, например:
 #ПЛОХО
for key in d.keys():
 #лучше
for key in d:
Алгоритм непонятный, скорее всего он не работает
 for key in d.keys():
    if all(d.get(key) == 1 for key in d.keys()):
У вас цикл по ключам словаря, а в нем еще один такой же цикл. Ну и зачем?
Да и вообще, словари как раз затем и нужны, чтобы быстро получать значение по ключу, а не перебирать их.
Вы используете в разных областях видимости один и тот же идентификатор key, сами не запутались?
FishHook
Вот ваше решение

 tekst = input("Введите текст: ") #Набор слов через пробел. Например, огурец помидор огурец перец
words = tekst.split(" ")
count_mapping = {}
for w in words:
    count_mapping.setdefault(w, 0)
    count_mapping[w] += 1
if all(v == 1 for v in count_mapping.values()):
    print("В тексте отсуствуют повторяющиеся слова.")
else:
    for word, count in count_mapping.items():
        if count > 1:
            print(word, "->", count)
Dorum
Полное условие задачи:
Дан текст: в первой строке задано число строк, далее идут сами строки. Выведите слово, которое в этом тексте встречается чаще всего. Если таких слов несколько, выведите то, которое меньше в лексикографическом порядке.
Решение:
 x = 0
text = []
word = []
result = []
n = int(input("Сколько будет строк? "))
while x != n:
    y = input("Введите текст: ")
    x += 1
    text.append(y)
string = " ".join(text)
new_text = string.split(" ")
print(new_text)
for i in new_text:
    word.append(new_text.count(i))
d = dict(zip(new_text, word))
if all(val == 1 for val in d.values()):
    print("В тексте отсутствуют повторяющиеся слова.")
else:
    for key, val in d.items():
        if val == max(word):
            result.append(key)
    result.sort()
    print(result[0])

Прошу проанализировать мой код. Буду признателен любой критике. Так же интересует вопрос как можно было это сделать проще, но с использованием словаря?
P.S Прошу прощения за сумбур в коде. Восприятие уже замылено. Было важно, чтобы код выполнял условия задачи.
marvellik
Dorum
Полное условие задачи:Дан текст: в первой строке задано число строк, далее идут сами строки. Выведите слово, которое в этом тексте встречается чаще всего. Если таких слов несколько, выведите то, которое меньше в лексикографическом порядке.Решение:
если вникнуть в задание то строк в тексте дано согласно значению из первой строки ( то есть не одна и слов в строке тоже не одно) а раз решение выполняется через словарь то смысла создавать список я не вижу. наверно проще получив строку в список сразу обрабатываем его создавая словарь где ключ слово а значение 1 и если ключ(слово) повторяется то в словаре с этим ключом увеличиваем значение на 1. ну а потом проходим по отсортированному словарю и сравниваем значения значений словаря по максимальному значению из словаря. при совпадении выводим ключ и выходим из цикла
 number_of_words = {}
for _ in range(int(input())):
    word = input().split()
    for i in word:
        if i not in number_of_words:
            number_of_words[i] = 1
        else:
            number_of_words[i] += 1
max_values = max(number_of_words.values())
for key in sorted(number_of_words.keys()):
    if number_of_words[key] == max_values:
        print(key)
        break
Dorum
FishHook
marvellik
Спасибо за уделенное время. Все учел. Многое взял на вооружение.
Isem
py.user.next
>>> import collections
>>>
>>> text = ‘abc def abc def abc’
>>>
>>> c = collections.Counter(text.split())
>>> max(c, key=lambda i: c)
'abc'
>>>

Dorum
Я только-только открыл для себя функцию “all”.
Функции all() и any() - это просто функции, которые сами по себе ничего не значат.
Для этой задачи сложно даже найти им применение.

Абсолютно верное решение по дзену. Но вот что касается, цитирую, “Функции all() и any() - это просто функции, которые сами по себе ничего не значат”, меня берет в дрожь. Это чрезвычайно полезные функции, которые значат то, о чем они сами говорят, и с ранним выходом.
py.user.next
Isem
Это чрезвычайно полезные функции
Ну, давай, грепни по своим исходникам эти функции и покажи результаты. Там будет ноль строк, потому что эти чрезвычайно полезные функции не такие уж и полезные. Ещё неизвестно, что полезнее, all() или math.sin().
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB