Làm thế nào để có được một giá trị ngẫu nhiên từ từ điển trong python


148

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

Hình dictnhư{'VENEZUELA':'CARACAS'}

Tôi có thể làm cái này như thế nào?

Câu trả lời:


259

Một cách sẽ là:

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

EDIT : Câu hỏi đã được thay đổi một vài năm sau bài đăng gốc, và bây giờ yêu cầu một cặp, thay vì một mục duy nhất. Dòng cuối cùng sẽ là:

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

141
Điều đó sẽ hoạt động trong Python 2.x d.keys()là một danh sách, nhưng nó sẽ không hoạt động trong Python 3.x, nơi d.keys()là một trình vòng lặp. Bạn nên làm random.choice(list(d.keys()))thay thế.
Duncan

21
@Duncan: Tôi không thể đợi cho đến khi tất cả cá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
Làm thế nào về: d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}Hehe, +1 cho tẩy não rất tinh tế ...
gentimouton

4
@gentimouton ... thú vị, nhưng có lẽ tôi chỉ đến thành phố đông dân nhất ở mỗi quốc gia - không phải thủ đô :)
Gerrat

12
Đây có phải là hiệu quả? Liệu quy mô này nếu dict được thực sự lớn?
Quang phổ


14

Thử cái này:

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

Điều này chắc chắn hoạt động.


12

Nếu bạn không muốn sử dụng randommô-đun, 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)

dict thứ tự không bảo toàn , bằng cách sử dụng, popitembạn nhận được các mục theo thứ tự tùy ý (nhưng không hoàn toàn ngẫu nhiên) từ nó.

Ngoài ra, hãy nhớ rằng popitemloại bỏ cặp khóa-giá trị khỏi từ điển, như đã nêu trong các tài liệu .

popitem () rất hữu ích khi lặp đi lặp lại một cách triệt để trên một từ điển


29
Điều này thật tệ, bởi vì nếu bạn tải từ điển theo cùng một thứ tự trên cùng một phiên bản python, bạn gần như chắc chắn sẽ nhận được cùng một mục.
Alex


31
python 3.6 dict thực sự là ĐẶT HÀNG ! Điều này cực kỳ quan trọng
Hoặc Duẩn

7
Câu trả lời này chỉ sai. Ngay cả trước 3.6, điều này sẽ không cung cấp cho bạn một giá trị ngẫu nhiên, nhưng một giá trị tùy thuộc vào giá trị băm của vật phẩm.
OBu

1
Bỏ qua sự không phù hợp với yêu cầu của OP, cách này là một cách tốt để vượt qua thực tế nextkhông hoạt động với từ điển vì nó là một ánh xạ. (Tôi đến đây để lấy cảm hứng và đây là nó).
Matteo Ferla

9
>>> 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 keystừ điển (các quốc gia).


2
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ó một lỗi như "đối tượng dict_keys 'không hỗ trợ lập chỉ mục". Bạn có biết những gì sai? Cảm ơn rất nhiều!!!
bíp

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

3
Sử dụng Random.sample thay vào đó, rẻ hơn so với việc sao chép các khóa vào danh sách.
steveayre

7

Điều này hoạt động trong Python 2 và Python 3:

Một khóa ngẫu nhiên:

random.choice(list(d.keys()))

Một giá trị ngẫu nhiên

random.choice(list(d.values()))

Khóa và giá trị ngẫu nhiên

random.choice(list(d.items()))

4

Nếu bạn không muốn sử dụng Random.choice (), bạn có thể thử theo 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'

Hãy chú ý: bạn tạo ra list(…)ở đây nhiều lần. Thế còn myDictionary_list = list(myDictionary)?
Cadoiz

4

Vì bài viết gốc muốn cặp :

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

(kiểu trăn 3)


3

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

Kiểm tra xem random.sample()cái nào sẽ chọn và trả về một phần tử ngẫu nhiên từ một danh sách. Bạn có thể nhận được một danh sách các khóa từ điển với dict.keys()và một danh sách các giá trị từ điển với dict.values().


5
random.samplerandom.choicekhông thể làm việc với các trình vòng lặp. Họ cần biết độ dài của chuỗi, không thể xác định được từ một trình vòng lặp.
AFoglia

10
không đâ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.sampletrả về kcác phần tử ngẫu nhiên , random.choicetrả về một phần tử ngẫu nhiên duy nhất
Anentropic

Vâng ... không bao giờ mát mẻ để cho rằng đây là một vấn đề bài tập về nhà. Những gì nói rằng làm cho cộng đồng?
jvriesem

3

Tôi giả sử rằng bạn đang làm một loại ứng dụng đố. Đối với loại ứng dụng này, tôi đã viết một hàm 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 đầu vào questions = {'VENEZUELA':'CARACAS', 'CANADA':'TORONTO'}và gọi hàm shuffle(questions)thì đầu ra sẽ như sau:

VENEZUELA? CARACAS
CANADA? TORONTO

Bạn có thể mở rộng điều này hơn nữa bằng cách xáo trộn các tùy chọn cũng


Bạn không nên lập trình vẽ mà không thay thế như thế này. Hãy tưởng tượng vẽ thứ 100 trong số 100 phần tử - 99% cơ hội trúng một phần tử bên trong selected_keys. Và bạn có thể sẽ lặp lại điều đó khoảng 100 lần. Ít nhất là xóa các phím đã lấy của q like del(q[current_selection])- bạn có thể ghi đè lên q với sự xáo trộn selected_keysmới giống như q = selected_keyssau mọi thứ. Cũng đừng quên nhận dạng! Hoặc nhìn vào np.random.choice(...)cách tiếp cận của tôi : stackoverflow.com/a/62843377/4575793
Cadoiz

1

Hãy thử điều này (sử dụng Random.choice từ các 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'

1

Với phiên bản hiện đại của Python (từ 3), các đối tượng được trả về bởi phương pháp dict.keys(), dict.values()dict.items()đang xem các đối tượng *. Và hey có thể được lặp đi lặp lại, vì vậy sử dụng trực tiếp random.choicelà không thể vì bây giờ chúng không phải là một danh sách hoặc bộ.

Một lựa chọn là sử dụng khả năng hiểu danh sách để thực hiện công việc với random.choice:

import random

colors = {
    'purple': '#7A4198',
    'turquoise':'#9ACBC9',
    'orange': '#EF5C35',
    'blue': '#19457D',
    'green': '#5AF9B5',
    'red': ' #E04160',
    'yellow': '#F9F985'
}

color=random.choice([hex_color for color_value in colors.values()]

print(f'The new color is: {color}')

Người giới thiệu:


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, 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 phù hợp sẽ cải thiện đáng kể giá trị lâu dài của nó bằng cách chỉ ra lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ giúp nó hữu ích hơn cho những người đọc tương lai với những câu hỏi tương tự khác. Vui lòng chỉnh 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.
Toby Speight

0

Tôi tìm thấy bài viết này bằng cách tìm kiếm một giải pháp khá so sánh. Để chọn nhiều yếu tố trong một dict, điều này có thể được sử dụng:

idx_picks = np.random.choice(len(d), num_of_picks, replace=False) #(Don't pick the same element twice)
result = dict ()
c_keys = [d.keys()] #not so efficient - unfortunately .keys() returns a non-indexable object because dicts are unordered
for i in idx_picks:
    result[c_keys[i]] = d[i]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.