Austausch in Liste

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
acidbath
User
Beiträge: 21
Registriert: Mittwoch 26. Januar 2011, 19:10

Hallo allerseits.

Nachdem ich mal wieder viel zu lange nichts mit Python gemacht hatte, wollte ich wenigstens wieder die rudimentären Kenntnisse reaktivieren und fand die Idee mit dem TextToSpeech recht spannend, die vor kurzem im Forum Erwähnung fand.
Naja, daraus ist nachfolgendes kleines Programm entstanden.
Mir geht's letztlich um die Umwandlung der 1 in 'eine', so daß die Sprachausgabe korrekt ist.
Wie stellt man das gescheit an?
Ursprünglich wollte ich alles direkt in der list comprehension machen, bin daran allerdings gescheitert, weil mir ein 'else-Zweig' fehlte. Ich könnte natürlich eine Liste der Elemente (gut, in diesem Fall nur zwei, aber mir geht's um eine allgemeine Lösung) an die Funktion 'one' übergeben und dort dann den Austausch vornehmen - aber ist das die 'pythonische Lösung'? Irgendeinen Kniff gibt's da doch bestimmt. :D Ein list.replace() scheint's ja nicht zu geben...

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8
import subprocess, random

digits = 7
correct = 0
wrong = 0

def say(text):
    p = subprocess.Popen(['say', text])
    p.wait()

def one(n):
    if n == 1:
        return 'eine'
    else:
        return n
    
tts = '''Willkommen bei einem Gedächtnistrainer für Mac OS X!
Zum Beenden bitte einfach RETURN drücken.'''

print tts
say(tts)

while True:
    randomints = [str(random.randint(0, 9)) for _ in range(digits)]
    randomstring = ''.join(randomints)
    
    say('.'.join(randomints))
    # ohne die Punkte macht der Mac daraus eine einzige Zahl
    
    answer = raw_input('Antwort: ')
    if answer:
        if answer == randomstring:
            say('Korrekt.')
            correct += 1
        else:
            say('Leider falsch.')
            wrong += 1
            print 'Die richtige Antwort wäre gewesen %s' % randomstring
    else:
        break
    
print '\n%d richtige und %d falsche Antwort(en).' % (correct, wrong)

correct, wrong = [one(l) for l in (correct, wrong)]

tts = '%s richtige und %s falsche Antwort bzw. Antworten.' % (str(correct), str(wrong))
say(tts)
Dank und Gruß,
Daniel
BlackJack

Das hier sollte als LC funktionieren:

Code: Alles auswählen

correct, wrong = [('eine' if n == 1 else n) for n in (correct, wrong)]
acidbath
User
Beiträge: 21
Registriert: Mittwoch 26. Januar 2011, 19:10

Klasse, vielen Dank!
Antworten