2015-05-25 24 views
8

Xin chào mọi người, tôi đang cố viết một chương trình bằng Python hoạt động như một trò chơi đố vui. Tôi đã thực hiện một từ điển ở đầu chương trình có chứa các giá trị mà người dùng sẽ được kiểm tra. Nó thiết lập như sau:Từ điển Python3 lặp qua các giá trị?

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

Vì vậy, tôi định nghĩa một hàm có sử dụng một vòng lặp for để lặp qua các phím từ điển và yêu cầu đầu vào từ người dùng, và so sánh đầu vào người sử dụng với giá trị phù hợp với chìa khóa.

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]) 

lượng tốt đang làm việc này trông như thế này:

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

Vì vậy, những gì tôi muốn để có thể làm là có một chức năng riêng biệt mà đặt câu hỏi theo cách khác, cung cấp cho người dùng số độ phân giải và yêu cầu người dùng nhập tên của tiêu chuẩn hiển thị. Vì vậy, tôi muốn thực hiện một vòng lặp for nhưng tôi không thực sự biết làm thế nào để (hoặc nếu bạn thậm chí có thể) lặp qua các giá trị trong từ điển và yêu cầu người dùng nhập các phím.

Tôi muốn có đầu ra mà trông giống như sau:

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

Tôi đã thử chơi với for value in PIX0.values() và thats cho phép tôi để lặp qua các giá trị điển, nhưng tôi không biết làm thế nào để sử dụng để "kiểm tra" câu trả lời của người dùng dựa trên các phím từ điển. Nếu bất cứ ai có thể giúp nó sẽ được đánh giá cao.

EDIT: Rất tiếc, tôi đang sử dụng Python3.

+0

Có vẻ như bạn đang tìm kiếm khả năng tra cứu khóa bằng giá trị trong từ điển. Có một câu trả lời cho điều đó ở đây: http://stackoverflow.com/questions/2568673/inverse-dictionary-lookup-python –

+0

Bạn đang sử dụng phiên bản Python nào? – michaelpri

Trả lời

22

Tùy thuộc vào phiên bản của bạn:

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)) 

Bạn cũng nên có thói quen sử dụng các chuỗi mới định dạng cú pháp ({} thay vì % nhà điều hành) từ PEP 3101:

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

+3

'iteritems()' không được hỗ trợ trong Python 3, mà tôi tin rằng OP đang sử dụng. – michaelpri

+0

Không thực sự có bất kỳ dấu hiệu nào về phiên bản mà anh ấy đang sử dụng. Cả Python và 3 đều hỗ trợ dấu ngoặc đơn trên các câu lệnh 'print', vì vậy không thể nói cho đến khi OP nói phiên bản nào anh ta đang sử dụng. – chown

+1

Giả định của tôi dựa trên các câu lệnh 'print()', và cũng có thể, OP sử dụng Python 3 trong [câu hỏi khác duy nhất của anh ấy] (http://stackoverflow.com/questions/30271466/trying-use-a-pth- file-to-add-a-path-in-tài liệu-thư mục-trên-mac), vì vậy tôi sẽ nghĩ rằng anh ấy sẽ sử dụng cùng một phiên bản – michaelpri

2

Bạn có thể tìm kiếm khóa tương ứng hoặc bạn có thể "đảo ngược" từ điển, nhưng xem xét cách bạn sử dụng, nó sẽ là tốt nhất nếu bạn chỉ lặp lại khóa/giá trị cặp. làm với items(). Sau đó, bạn có cả trực tiếp trong các biến và không cần tra cứu gì cả:

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

Tất nhiên, bạn có thể sử dụng cả hai cách đó.

Hoặc nếu bạn không thực sự cần từ điển cho thứ khác, bạn có thể bỏ qua từ điển và có danh sách các cặp thông thường.

+2

@chown Tôi đang sử dụng Python 3. Which * không có * 'iteritems' và nơi' items' đã là ý của bạn. OP sử dụng dấu ngoặc đơn với 'print' mạnh mẽ cho thấy anh ta cũng sử dụng Python 3. –

1

Bạn chỉ có thể tìm giá trị tương ứng với khóa và sau đó kiểm tra xem đầu vào có bằng khóa hay không.

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

Ngoài ra, bạn sẽ phải thay đổi dòng cuối cùng để khớp, vì vậy nó sẽ in khóa thay vì giá trị nếu bạn nhận được câu trả lời sai.

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

Ngoài ra, tôi khuyên bạn nên sử dụng str.format để định dạng chuỗi thay vì cú pháp %.

mã đầy đủ của bạn sẽ trông như thế này (sau khi thêm vào định dạng chuỗi)

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

Nếu tất cả các giá trị của bạn là duy nhất, bạn có thể làm một cuốn từ điển ngược lại:

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

Kết quả:

>>> PIXO_reverse 

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

Bây giờ bạn có thể sử dụng cùng một logic như trước đây.

0

Tạo từ điển ngược lại:

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

Sau đó chạy cùng mã trên từ điển này để thay thế (sử dụng PIX1 thay vì PIX0).

BTW, tôi không chắc về Python 3, nhưng trong Python 2 bạn cần sử dụng raw_input thay vì input.

Các vấn đề liên quan