Я хочу, чтобы моя программа печатала только одно случайное слово из списка в моем словаре, но я не могу найти для этого правильный синтаксис. Я попытался использовать 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
Danny Garcia 9 Май 2016 в 06:57

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
1
smac89 9 Май 2016 в 04:13

Это решение не изменяет ваш исходный словарь

for x in part2:
    s = random.choice(thesaurus.get(x, [x]))
    newlist.append(s)

Ваш словарь отображает строку в список строк, поэтому ваше исходное решение помещает список вместо строки. random.choice выбирает случайный элемент из списка.

0
Colin Yang 9 Май 2016 в 04:27

map ваш вывод в это. Вы можете присоединиться к списку вместе, чтобы сформировать строку по вашему желанию.

newList= list(map(lambda x:  random.choice(x) if type(x) == list else x, newList))

print(" ".join(newList))
1
mattsap 9 Май 2016 в 04:15
 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)
2
Joran Beasley 9 Май 2016 в 04:05