2016-05-09 14 views
4

Ich möchte, dass mein Programm nur ein zufälliges Wort aus der Liste in meinem Wörterbuch druckt, aber ich kann nicht die richtige Syntax dafür zu bekommen scheinen. Ich versuchte mit popitem() einen zufälligen Wert aus der Liste zu bekommen, aber es scheint nicht zu funktionieren. Hier ist mein Code:Drucken Sie ein Wort aus einer Liste in einem Wörterbuch (Python)

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) 

Wenn zum Beispiel des Eingang

i am happy 

Die erwartete Ausgabe

wäre ist
i am glad 

oder irgendein zufälliges Wort aus der Liste im Wörterbuch.

Aber jetzt sieht meine Ausgabe wie folgt:

['i', 'am', ['glad', 'blissful', 'ecstatic', 'at ease']] 

ich weiß, dass es ein anderer Thread mit diesem beteiligt ist, aber es scheint nicht, dieses spezielle Problem zu beheben.

Jede Hilfe wäre willkommen!

edit:

Wenn ich diese Formel mit einer importierten Datei mit einer langen Liste von Worten arbeiten erweitert, wie würde ich den Code ändern müssen?

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) 

Probe von Zeilentext im "Thesaurus" file:

abash,humility,fear 
+0

Was meinen Sie mit 'thesaurus.get (x, x)'? – Arman

+2

@Arman das zweite 'x' ist ein Standardwert. Die Aussage bedeutet im Wesentlichen "Holen Sie sich den Wert mit Schlüssel' x' oder geben Sie einfach 'x' zurück, wenn kein Wert gefunden wird" – smac89

Antwort

1

Vielleicht möchten Sie die Verwendung des random Modul machen:

Beispiel:

import random 
>>> l = list(range(10)) 
>>> random.choice(l) 
5 
>>> random.choice(l) 
9 

In Ihrem Fall könnten Sie tun:

print (" ".join(random.choice(thesaurus[x]) if x in thesaurus else x for x in part2)) 

Beispiel:

>>> 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 
+0

Danke! Wenn ich diese Formel erweitert, um mit einer importierten Datei mit einer langen Liste von Wörtern zu arbeiten, wie würde ich den Code ändern müssen, den du oben gepostet hast? Ich habe den ursprünglichen Beitrag bearbeitet, um den erweiterten Code zu zeigen, jede Hilfe wird wirklich geschätzt! –

2
thesaurus.get(x,x) 

bedeutet thesaurus[x] if x in thesaurus else x

seit thesaurus["happy"] ist eine Liste es die ganze Liste zurück

Ich denke, Sie möchten nur einen einzigen Artikel

bekommen
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) 
+0

Das würde die Liste verkleinern, nicht? Das scheint nicht angemessen zu sein. –

+0

er sagte, er versuchte "popitem" so dachte ich, vielleicht war es –

+0

Danke! Wenn ich diese Formel erweitert habe, um mit einer importierten Datei mit einer langen Liste von Wörtern zu arbeiten, wie müsste ich den oben angegebenen Code ändern? Ich habe den ursprünglichen Post bearbeitet, um den erweiterten Code zu zeigen, jede Hilfe wird wirklich geschätzt! –

1

map Ihre Ausgabe zu diesem. Sie können die Liste zusammenfügen, um eine Zeichenfolge zu bilden, die Sie auch möchten.

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

print(" ".join(newList)) 
+2

'type (x)' ist im Allgemeinen kein guter Weg, um den Typ zu prüfen ... es ist viel vorzuziehen, 'isinstance' zu ​​verwenden, dies hat das zusätzliche Problem, durch die Liste zu gehen und die Zeitkomplexität effektiv zu verdoppeln (wahrscheinlich ist nicht viel ein Problem) ... –

+0

Kann jemand meinen Beitrag redigieren, um ihn richtig zu formatieren? :(nicht sicher, wie es auf Handy zu tun. – mattsap

+1

seit es funktioniert und Sie es auf Handy krank geschrieben geben +1 obwohl: P –

0

Diese Lösung ändert nicht Ihre ursprüngliche Wörterbuch

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

Ihr Wörterbuch ordnet eine Zeichenfolge Liste von Strings, damit Ihre ursprüngliche Lösung stellt eine Liste an die Stelle einer Zeichenkette. random.choice wählt ein zufälliges Element aus der Liste.

Verwandte Themen