Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 8, 2016 21:02:19

Dorum
Зарегистрирован: 2016-11-26
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Словари.

Добрый день!
Условие:
Дан текст. Выведите слово, которое в этом тексте встречается чаще всего.
Решение:

 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) Как бы Вы решили эту задачу?

Заранее спасибо.

Отредактировано Dorum (Дек. 8, 2016 21:04:03)

Офлайн

#2 Дек. 9, 2016 03:13:11

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9897
Репутация: +  855  -
Профиль   Отправить e-mail  

Словари.

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() - это просто функции, которые сами по себе ничего не значат.
Для этой задачи сложно даже найти им применение.



Отредактировано py.user.next (Дек. 9, 2016 03:17:02)

Офлайн

#3 Дек. 9, 2016 09:59:07

Dorum
Зарегистрирован: 2016-11-26
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Словари.

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

P.S Касаемо Вашего решения. Меня интересует путь решения через словарь. Забыл упомянуть.

Отредактировано Dorum (Дек. 9, 2016 09:59:51)

Офлайн

#4 Дек. 9, 2016 10:16:03

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Словари.

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 (Дек. 9, 2016 10:16:23)

Офлайн

#5 Дек. 9, 2016 10:23:11

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Словари.

Вот ваше решение

 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)



Офлайн

#6 Дек. 9, 2016 12:49:28

Dorum
Зарегистрирован: 2016-11-26
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Словари.

Полное условие задачи:
Дан текст: в первой строке задано число строк, далее идут сами строки. Выведите слово, которое в этом тексте встречается чаще всего. Если таких слов несколько, выведите то, которое меньше в лексикографическом порядке.
Решение:

 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 Прошу прощения за сумбур в коде. Восприятие уже замылено. Было важно, чтобы код выполнял условия задачи.

Офлайн

#7 Дек. 9, 2016 19:52:29

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Словари.

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

Отредактировано marvellik (Дек. 9, 2016 20:07:06)

Офлайн

#8 Дек. 10, 2016 18:28:59

Dorum
Зарегистрирован: 2016-11-26
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Словари.

FishHook
marvellik
Спасибо за уделенное время. Все учел. Многое взял на вооружение.

Офлайн

#9 Дек. 10, 2016 19:13:24

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Словари.

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() - это просто функции, которые сами по себе ничего не значат”, меня берет в дрожь. Это чрезвычайно полезные функции, которые значат то, о чем они сами говорят, и с ранним выходом.



Офлайн

#10 Дек. 11, 2016 03:49:22

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9897
Репутация: +  855  -
Профиль   Отправить e-mail  

Словари.

Isem
Это чрезвычайно полезные функции
Ну, давай, грепни по своим исходникам эти функции и покажи результаты. Там будет ноль строк, потому что эти чрезвычайно полезные функции не такие уж и полезные. Ещё неизвестно, что полезнее, all() или math.sin().



Отредактировано py.user.next (Дек. 11, 2016 03:49:45)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version