2011-02-01 11 views

Odpowiedz

163

Jednym ze sposobów (w Pythonie 2. *) byłoby:

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

EDIT: Pytanie zostało zmienione kilka lat po pierwotnym poście, a teraz prosi o parę, a nie pojedyncza pozycja. Końcowa linia powinna być:

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

T hat będzie działał w Pythonie 2.x, gdzie 'd.keys()' jest listą, ale nie będzie działać w Pythonie 3.x gdzie 'd.keys()' jest iteratorem. Zamiast tego powinieneś użyć 'random.choice (list (d.keys()))'. – Duncan

+17

@Duncan: Nie mogę się doczekać, aż wszystkie biblioteki 3rd party będą kompatybilne z Python 3.x, więc pytania w Pythonie nie wymagają 2 odpowiedzi na każde pytanie. – Gerrat

+9

Err about: 'd = {'VENEZUELA': 'CARACAS', 'CANADA': 'OTTAWA'}' Hehe, +1 za bardzo subtelne pranie mózgu ... – gentimouton

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

Dzwoniąc random.choice na keys słownika (państwa).

+1

Witam, próbuję użyć twojej metody, aby losowo wybrać jeden klucz z danego słownika, ale to nie działa. Mój słownik wygląda jak a = {'walk': 20, 'run': 80} i kiedy używam random.choice (a.keys()), jest błąd jak "obiekt dict_keys" nie obsługuje indeksowania ". Czy wiesz, co jest nie tak? Wielkie dzięki!!! – beepretty

+0

@beepretty dict.keys() zwraca obiekt iterowalny, a nie obiekt podobny do listy. Aby rozwiązać problem, użyj 'random.choice (list (d.keys()))'. – Greenstick

3

Ponieważ jest to praca domowa:

Wyjazd random.sample() który wybierze i powrócić losowy element z listy. Możesz uzyskać listę kluczy słownika z dict.keys() i listę wartości słownika z dict.values().

+5

'random.sample' i' random.choice' nie może działać z iteratorami. Muszą znać długość sekwencji, której nie można określić na podstawie iteratora. – AFoglia

+8

no to nie jest praca domowa piszę to, aby mi pomóc z hiszpańskim. – tekknolagi

+3

'random.sample' zwraca' k' losowe _elementy_, 'random.choice' zwraca pojedynczy element losowy – Anentropic

16

Jeśli nie chcesz korzystać z modułu random, można także spróbować popitem():

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

Od czasu dictdoesn't preserve order, używając popitem masz przedmiotów w sposób arbitralny (ale nie wyłącznie) losowej kolejności z tego.

Należy również pamiętać, że popitem usuwa parę klucz-wartość ze słownika, zgodnie z docs.

popitem() jest przydatna do destrukcyjnego iteracyjne nad słownikiem

+14

To jest złe, ponieważ jeśli załadujesz słownik w tej samej kolejności na tej samej wersji Pythona, prawie na pewno otrzymasz ten sam przedmiot. – Alex

+0

Zobacz także: http://stackoverflow.com/questions/10593651/pythonic-way-to-access-arbitrary-element-from-dictionary –

+6

python 3.6 dict faktycznie * ORDERED *! To jest bardzo ważne –

3

Jeśli nie chcesz używać random.choice() można spróbować w ten sposób:

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

I napisałem ten stara się rozwiązać ten sam problem:

https://github.com/robtandy/randomdict

Ma O (1) losowy dostęp do kluczy, wartości i przedmiotów.

+0

To jest niesamowite, wielkie dzięki! –

3

Spróbuj tego:

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

To na pewno działa.

2

Zakładam, że robisz quizu rodzaj aplikacji.Dla tego rodzaju aplikacji Pisałem funkcję, która przedstawia się następująco:

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

Jeśli dam wejście questions = {'VENEZUELA':'CARACAS', 'CANADA':'TORONTO'} i wywołać funkcję shuffle(questions) Następnie wyjście będzie w następujący sposób:

 
VENEZUELA? CARACAS 
CANADA? TORONTO 

Możesz rozszerzyć to jeszcze bardziej, tasując opcje również
Mam nadzieję, że to pomoże.
Źródło: RADIUS OF CIRCLE

0

Spróbuj (używając random.choice z pozycji)

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

Ponieważ oryginalny post chciał parę:

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

(python 3 style)

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

Witamy w Stack Overflow! Dziękujemy za ten fragment kodu, który może zapewnić krótkoterminową pomoc w ograniczonym zakresie. Właściwe wyjaśnienie znacznie poprawi (// meta.stackexchange.com/q/114762) jego długoterminową wartość, pokazując * dlaczego * jest to dobre rozwiązanie problemu i sprawiłoby, że byłby bardziej przydatny dla przyszłych czytelników z inne, podobne pytania. Proszę [edytuj] swoją odpowiedź, aby dodać wyjaśnienia, w tym założenia, które podjąłeś. –

Powiązane problemy