Я хочу, чтобы моя программа печатала только одно случайное слово из списка в моем словаре, но я не могу найти для этого правильный синтаксис. Я попытался использовать popitem (), чтобы получить случайное значение из списка, но похоже, что это не работает. Вот мой код:
import random
thesaurus = {
"happy":["glad", "blissful", "ecstatic", "at ease"],
"sad" :["bleak", "blue", "depressed"]
}
# input
phrase = input("Enter a phrase: ")
# turn input into list
part1 = phrase.split()
part2 = list(part1)
newlist = []
for x in part2:
s = thesaurus.get(x, x)
newlist.append(s)
print (newlist)
Например, если на входе
i am happy
Ожидаемый результат будет
i am glad
Или любое случайное слово из списка в словаре.
Но прямо сейчас мой результат выглядит так:
['i', 'am', ['glad', 'blissful', 'ecstatic', 'at ease']]
Я знаю, что с этим связана еще одна тема, но, похоже, она не решает эту конкретную проблему.
Любая помощь была бы признательна!
Редактировать:
Если бы я расширил эту формулу для работы с импортированным файлом с длинным списком слов, как мне пришлось бы изменить код?
newDict = {}
with open('thesaurus.txt', 'r') as f:
for line in f:
splitLine = line.split()
newDict[(splitLine[0])] = ",".join(splitLine[1:])
print ("Total words in thesaurus: ", len(newDict))
# input
phrase = input("Enter a phrase: ")
# turn input into list
part1 = phrase.split()
part2 = list(part1)
# testing input
newlist = []
for x in part2:
s = newDict[x].pop() if x in newDict else x
s = random.choice(newDict[x]).upper() if x in newDict else x
newlist.append(s)
newphrase = ' '.join(newlist)
print (newphrase)
Образец текста строки в файле "тезауруса":
abash,humility,fear
4 ответа
Возможно, вы захотите использовать модуль random . :
Примере:
import random
>>> l = list(range(10))
>>> random.choice(l)
5
>>> random.choice(l)
9
В вашем случае вы можете сделать:
print (" ".join(random.choice(thesaurus[x]) if x in thesaurus else x for x in part2))
Примере:
>>> import random
>>> phrase = "I am feeling sad that he left, but that's okay because I'm happy he will be back soon"
>>>
>>> thesaurus = { "happy":["glad", "blissful", "ecstatic", "at ease"],
... "sad" :["bleak", "blue", "depressed"]
... }
>>> print (" ".join(random.choice(thesaurus[x]) if x in thesaurus else x for x in phrase.split()))
I am feeling bleak that he left, but that's okay because I'm blissful he will be back soon
Это решение не изменяет ваш исходный словарь
for x in part2:
s = random.choice(thesaurus.get(x, [x]))
newlist.append(s)
Ваш словарь отображает строку в список строк, поэтому ваше исходное решение помещает список вместо строки. random.choice
выбирает случайный элемент из списка.
map
ваш вывод в это. Вы можете присоединиться к списку вместе, чтобы сформировать строку по вашему желанию.
newList= list(map(lambda x: random.choice(x) if type(x) == list else x, newList))
print(" ".join(newList))
thesaurus.get(x,x)
Означает thesaurus[x] if x in thesaurus else x
Поскольку thesaurus["happy"]
- это список, он возвращает весь список
Я думаю, ты хочешь получить только один предмет
for x in part2:
s = thesaurus[x].pop() if x in thesaurus else x # returns first word (and removes from list)
s = thesaurus[x][0] if x in thesaurus else x # returns first word without removing it
s = random.choice(thesaurus[x])if x in thesaurus else x # returns random word
newlist.append(s)
Похожие вопросы
Новые вопросы
list
Тег списка может относиться к связанному списку (упорядоченный набор узлов, каждый из которых ссылается на своего преемника) или к форме динамического массива. Не использовать для списков HTML, используйте вместо этого [html-lists].