简体   繁体   中英

How to print random items from a dictionary?

everyone. I'm trying to complete a basic assignment. The program should allow a user to type in a phrase. If the phrase contains the word "happy" or "sad", that word should then be randomly replaced by a synonym (stored in a dictionary). The new phrase should then be printed out. What am I doing wrong? Every time I try to run it, the program crashes. This is the error I get:

  0_part1.py", line 13, in <module>
    phrase["happy"] = random.choice(thesaurus["happy"])
TypeError: 'str' object does not support item assignment

Here is what I have so far:

import random

thesaurus = {
    "happy": ["glad", "blissful", "ecstatic", "at ease"],
    "sad": ["bleak", "blue", "depressed"]
    }

phrase = input("Enter a phrase: ")
phrase2 = phrase.split(' ')


if "happy" in phrase:
    phrase["happy"] = random.choice(thesaurus["happy"])
if "sad" in phrase:
    phrase["sad"] = random.choice(thesaurus["sad"])

print(phrase)

The reason for your error is that phrase is a string, and strings are immutable. On top of that, strings are sequences , not mappings ; you can index them or slice them (eg, happy_index = phrase.find("happy"); phrase[happy_index:happy_index+len("happy")] ), but you can't use them like dictionaries.

If you want to create a new string, replacing the substring happy with another word, use the replace method.

And there's no reason to check first; if happy isn't found, replace wil do nothing.

So:

phrase = phrase.replace("happy", random.choice(thesaurus["happy"]))

While we're at it, instead of explicitly looking up each key, you may want to loop over the dictionary and apply all the synonyms:

for key, replacements in thesaurus.items():
    phrase = phrase.replace(key, random.choice(replacements))

Finally, notice that this code will replace all instances of happy with the same replacement. Which I think your intended code was also trying to do. If you want to replace each of them with a separately randomly-chosen synonym, that's a bit more complicated. You could loop over phrase.find("happy", offset) until it returns -1 , but a neat trick might make it simpler: split the string around each instance of happy , substitute in a different synonym for each split part, then join them all back together. Like this:

parts = phrase.split("happy")
parts[:-1] = [part + random.choice(thesaurus["happy"]) for part in parts[:-1]]
phrase = ''.join(parts)

Generate a random number from (0..[size of list - 1]) . Then, access that index of the list. To get the length of a list, just do len(list_name) .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM