2011-02-01 76 views
91

Làm cách nào để có được một cặp ngẫu nhiên từ một số dict? Tôi đang thực hiện một trò chơi mà bạn cần đoán vốn của một quốc gia và tôi cần câu hỏi để xuất hiện ngẫu nhiên.Cách lấy giá trị ngẫu nhiên trong từ điển python

Các dict trông giống như {'VENEZUELA':'CARACAS'}

Làm thế nào tôi có thể làm điều này?

Trả lời

163

Một cách (bằng Python 2. *) sẽ là:

import random 
d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'} 
random.choice(d.keys()) 

EDIT: Câu hỏi đã thay đổi một vài năm sau khi các bài bản gốc, và bây giờ yêu cầu một cặp, chứ không phải là một đơn mục. Dòng cuối cùng bây giờ sẽ là:

country, capital = random.choice(list(d.items())) 
+115

T hat sẽ làm việc trong Python 2.x trong đó 'd.keys()' là một danh sách, nhưng nó sẽ không hoạt động trong Python 3.x, trong đó 'd.keys()' là một trình lặp. Bạn nên làm 'random.choice (list (d.keys()))' để thay thế. – Duncan

+17

@Duncan: Tôi không thể đợi cho đến khi tất cả thư viện của bên thứ 3 tương thích với Python 3.x, vì vậy các câu hỏi Python không cần 2 câu trả lời cho mỗi câu hỏi. – Gerrat

+9

Err như thế nào về: 'd = {'VENEZUELA': 'CARACAS', 'CANADA': 'OTTAWA'}' Hehe, +1 cho bộ não rất tinh tế ... – gentimouton

6
>>> import random 
>>> d = dict(Venezuela = 1, Spain = 2, USA = 3, Italy = 4) 
>>> random.choice(d.keys()) 
'Venezuela' 
>>> random.choice(d.keys()) 
'USA' 

Bằng cách gọi random.choice trên keys của từ điển (các nước).

+1

Xin chào, tôi cố gắng sử dụng phương pháp của bạn để chọn ngẫu nhiên một khóa từ một từ điển nhất định, nhưng nó không hoạt động. Từ điển của tôi trông giống như a = {'walk': 20, 'run': 80} và khi tôi sử dụng random.choice (a.keys()), có lỗi như đối tượng "dict_keys" không hỗ trợ lập chỉ mục ". Bạn có biết có chuyện gì không? Cảm ơn rất nhiều!!! – beepretty

+0

@beepretty dict.keys() trả về một đối tượng có thể lặp lại, không phải đối tượng giống như danh sách. Để giải quyết lỗi, sử dụng 'random.choice (danh sách (d.keys()))'. – Greenstick

3

Do đây là bài tập về nhà:

Check-out random.sample() mà sẽ lựa chọn và trả về một yếu tố ngẫu nhiên từ danh sách. Bạn có thể nhận danh sách các phím từ điển với dict.keys() và danh sách giá trị từ điển với dict.values().

+5

'random.sample' và' random.choice' không thể hoạt động với các trình vòng lặp. Họ cần phải biết chiều dài của chuỗi, mà không thể được xác định từ một iterator. – AFoglia

+8

không có điều này KHÔNG phải là bài tập về nhà tôi đang viết nó để giúp tôi với tiếng Tây Ban Nha. – tekknolagi

+3

'random.sample' trả về' k' random _elements_, 'random.choice' trả về một phần tử ngẫu nhiên – Anentropic

16

Nếu bạn không muốn sử dụng các mô-đun random, bạn cũng có thể thử popitem():

>> d = {'a': 1, 'b': 5, 'c': 7} 
>>> d.popitem() 
('a', 1) 
>>> d 
{'c': 7, 'b': 5} 
>>> d.popitem() 
('c', 7) 

Kể từ khi dictdoesn't preserve order, bằng cách sử dụng popitem bạn nhận được các mục trong một trật tự tùy ý (nhưng không hoàn toàn ngẫu nhiên) từ nó.

Cũng xin lưu ý rằng popitem xóa cặp khóa-giá trị khỏi từ điển, như đã nêu trong docs.

popitem() rất hữu ích để lặp triệt tiêu trên một cuốn từ điển

+14

Đây là loại xấu, bởi vì nếu bạn tải từ điển trong cùng một thứ tự trên cùng một phiên bản của python bạn gần như chắc chắn sẽ nhận được cùng một mục. – Alex

+0

Xem thêm: http://stackoverflow.com/questions/10593651/pythonic-way-to-access-arbitrary-element-from-dictionary –

+6

python 3.6 dict thực sự là * ORDERED *! Đây là điều cực kỳ quan trọng –

3

Nếu bạn không muốn sử dụng random.choice(), bạn có thể thử cách này:

>>> list(myDictionary)[i] 
'VENEZUELA' 
>>> myDictionary = {'VENEZUELA':'CARACAS', 'IRAN' : 'TEHRAN'} 
>>> import random 
>>> i = random.randint(0, len(myDictionary) - 1) 
>>> myDictionary[list(myDictionary)[i]] 
'TEHRAN' 
>>> list(myDictionary)[i] 
'IRAN' 
15

tôi đã viết bài này cố gắng giải quyết cùng một vấn đề:

https://github.com/robtandy/randomdict

Có O (1) truy cập ngẫu nhiên vào các khóa, giá trị và các mục.

+0

Điều này thật tuyệt vời, cảm ơn rất nhiều! –

3

Hãy thử điều này:

import random 
a = dict(....) # a is some dictionary 
random_key = random.sample(a, 1)[0] 

chắc chắn này hoạt động.

2

Tôi giả định rằng bạn đang tạo một loại bài kiểm tra ứng dụng.Cho các loại hình ứng dụng tôi đã viết một chức năng mà là như sau:

def shuffle(q): 
""" 
The input of the function will 
be the dictionary of the question 
and answers. The output will 
be a random question with answer 
""" 
selected_keys = [] 
i = 0 
while i < len(q): 
    current_selection = random.choice(q.keys()) 
    if current_selection not in selected_keys: 
     selected_keys.append(current_selection) 
     i = i+1 
     print(current_selection+'? '+str(q[current_selection])) 

Nếu tôi sẽ cung cấp cho các đầu vào của questions = {'VENEZUELA':'CARACAS', 'CANADA':'TORONTO'} và gọi hàm shuffle(questions) Sau đó sản lượng sẽ được như sau:

 
VENEZUELA? CARACAS 
CANADA? TORONTO 

Bạn có thể mở rộng thêm điều này bằng cách xáo trộn các tùy chọn này cũng
Tôi hy vọng điều này sẽ hữu ích.
Nguồn: RADIUS OF CIRCLE

0

Hãy thử này (sử dụng random.choice từ mục)

import random 

a={ "str" : "sda" , "number" : 123, 55 : "num"} 
random.choice(list(a.items())) 
# ('str', 'sda') 
random.choice(list(a.items()))[1] # getting a value 
# 'num' 
2

Kể từ khi bài gốc muốn cặp:

import random 
d = {'VENEZUELA':'CARACAS', 'CANADA':'TORONTO'} 
country, capital = random.choice(list(d.items())) 

(python 3 phong cách)

0
b = { 'video':0, 'music':23,"picture":12 } 
random.choice(tuple(b.items())) ('music', 23) 
random.choice(tuple(b.items())) ('music', 23) 
random.choice(tuple(b.items())) ('picture', 12) 
random.choice(tuple(b.items())) ('video', 0) 
+2

Chào mừng bạn đến với Stack Overflow! Cảm ơn bạn về đoạn mã này, đoạn mã này có thể cung cấp một số trợ giúp ngắn hạn có giới hạn. Một lời giải thích thích hợp [sẽ cải thiện rất nhiều] (// meta.stackexchange.com/q/114762) giá trị lâu dài của nó bằng cách hiển thị * tại sao * đây là một giải pháp tốt cho vấn đề, và sẽ làm cho nó hữu ích hơn cho người đọc trong tương lai các câu hỏi tương tự khác. Vui lòng [sửa] câu trả lời của bạn để thêm một số giải thích, bao gồm các giả định bạn đã thực hiện. –

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