2015-05-25 17 views
8

Hej wszystkim próbuję napisać program w Pythonie, który działa jako gra quizowa. Zrobiłem słownik na początku programu, który zawiera wartości, o których użytkownik będzie pytany. Jego skonfigurować tak:Słownik Python3 iteruje po wartościach?

PIX0 = {"QVGA":"320x240", "VGA":"640x480", "SVGA":"800x600"} 

Więc zdefiniowano funkcję, która używa for pętli do iterację kluczy słownikowych i prosi o wejście od użytkownika i porównuje dane wprowadzone przez użytkownika do wartości dopasowane z kluczem.

for key in PIX0: 
    NUM = input("What is the Resolution of %s?" % key) 
    if NUM == PIX0[key]: 
     print ("Nice Job!") 
     count = count + 1 
    else: 
     print("I'm sorry but thats wrong. The correct answer was: %s." % PIX0[key]) 

ta działa poprawnie wyjście wygląda następująco:

What is the Resolution of Full HD? 1920x1080 
Nice Job! 
What is the Resolution of VGA? 640x480 
Nice Job! 

Więc co chciałbym być w stanie zrobić, to mieć oddzielną funkcję, która zadaje pytanie w drugą stronę, zapewniając użytkownikowi numery rozdzielczości i podanie przez użytkownika nazwy standardu wyświetlania. Dlatego chcę utworzyć pętlę for, ale tak naprawdę nie wiem jak (lub jeśli nawet można) iterować wartości w słowniku i poprosić użytkownika o wprowadzenie kluczy.

Chciałbym mieć moc, która wygląda mniej więcej tak:

Which standard has a resolution of 1920x1080? Full HD 
Nice Job! 
What standard has a resolution of 640x480? VGA 
Nice Job! 

próbowałam grać z for value in PIX0.values() i ów pozwolił mi iterację wartości słownikowych, ale nie wiem jak użyj tego, aby "sprawdzić" odpowiedzi użytkownika na klawisze słownika. Jeśli ktokolwiek mógłby pomóc, byłoby to docenione.

EDYCJA: Przepraszam, używam Python3.

+0

Wygląda na to, że szukasz możliwości wyszukania klucza według wartości w słowniku. Tutaj jest odpowiedź na to pytanie: http://stackoverflow.com/questions/2568673/inverse-dictionary-lookup-python –

+0

Którą wersję Pythona używasz? – michaelpri

Odpowiedz

22

zależności od wersji:

Python 2.x:

for key, val in PIX0.iteritems(): 
    NUM = input("Which standard has a resolution of {!r}?".format(val)) 
    if NUM == key: 
     print ("Nice Job!") 
     count = count + 1 
    else: 
     print("I'm sorry but thats wrong. The correct answer was: {!r}.".format(key)) 

Python 3.x:

for key, val in PIX0.items(): 
    NUM = input("Which standard has a resolution of {!r}?".format(val)) 
    if NUM == key: 
     print ("Nice Job!") 
     count = count + 1 
    else: 
     print("I'm sorry but thats wrong. The correct answer was: {!r}.".format(key)) 

Należy również dostać w zwyczaju przy użyciu nowego ciąg formatowanie składnia ({} zamiast operatora %) od PEP 3101:

https://www.python.org/dev/peps/pep-3101/

+3

'iteritems()' nie jest obsługiwane w Pythonie 3, który moim zdaniem używa OP. – michaelpri

+0

Nie ma żadnego wskazania, której wersji używa. Python 2 i 3 obsługują nawias w instrukcjach 'print', więc nie można tego określić, dopóki OP nie określi, której wersji używa. – chown

+1

Moje założenie było oparte na instrukcjach 'print()', a także, że OP używał Pythona 3 w jego [tylko inne pytanie] (http://stackoverflow.com/questions/30271466/trying-use-a-hth- file-to-add-a-path-in-documents-folder-na-mac), więc sądzę, że używałby tej samej wersji. – michaelpri

2

Można wyszukać odpowiedni klucz lub "odwrócić" słownik, ale biorąc pod uwagę sposób jego użycia, najlepiej byłoby po prostu powtórzyć po kluczach/wartościach par w pierwszej kolejności, które można zrób z items(). Wtedy masz oba bezpośrednio w zmiennych i nie potrzebujesz żadnego wyszukiwania:

for key, value in PIX0.items(): 
    NUM = input("What is the Resolution of %s?" % key) 
    if NUM == value: 

Możesz oczywiście użyć obu tych sposobów.

Jeśli naprawdę nie potrzebujesz słownika do czegoś innego, możesz porzucić słownik i mieć zwykłą listę par.

+2

@chown Używam Pythona 3. Który * nie ma * 'iteritems' i gdzie' items' już jest tym co masz na myśli. OP za pomocą nawiasów z 'print' zdecydowanie sugeruje, że używa również Pythona 3. –

1

Można po prostu wyszukać wartość odpowiadającą kluczowi, a następnie sprawdzić, czy dane wejściowe są równe klawiszowi.

for key in PIX0: 
    NUM = input("Which standard has a resolution of %s " % PIX0[key]) 
    if NUM == key: 

Ponadto, trzeba będzie zmienić ostatni wiersz, aby dopasować się, więc będzie zamiast drukować klawisz wartości jeśli masz złą odpowiedź.

print("I'm sorry but thats wrong. The correct answer was: %s." % key) 

Również polecam korzystania str.format do formatowania łańcucha zamiast składni %.

Twój pełny kod powinien wyglądać następująco (po dodaniu w formatowaniu smyczkowy)

PIX0 = {"QVGA":"320x240", "VGA":"640x480", "SVGA":"800x600"} 

for key in PIX0: 
    NUM = input("Which standard has a resolution of {}".format(PIX0[key])) 
    if NUM == key: 
     print ("Nice Job!") 
     count = count + 1 
    else: 
     print("I'm sorry but that's wrong. The correct answer was: {}.".format(key)) 
0

Jeśli wszystkie wartości są unikatowe, można dokonać odwrotnego słownika:

PIXO_reverse = {v: k for k, v in PIX0.items()} 

Wynik:

>>> PIXO_reverse 

{'320x240': 'QVGA', '640x480': 'VGA', '800x600': 'SVGA'} 

Teraz możesz użyć tej samej logiki, co poprzednio.

0

Tworzenie odwrotny słownika:

PIX1 = {} 
for key in PIX0.keys(): 
    PIX1[PIX0.get(key)] = key 

Następnie uruchom ten sam kod do tego słownika zamiast (używając PIX1 zamiast PIX0).

BTW, nie jestem pewien o Pythonie 3, ale w Pythonie 2 trzeba użyć raw_input zamiast input.