Jak uzyskać losową parę z dict
? Tworzę grę, w której musisz odgadnąć stolica kraju i potrzebuję pytań, aby pojawiły się losowo.Jak uzyskać losową wartość w słowniku Pythona
dict
wygląda {'VENEZUELA':'CARACAS'}
Jak mogę to zrobić?
Jak uzyskać losową parę z dict
? Tworzę grę, w której musisz odgadnąć stolica kraju i potrzebuję pytań, aby pojawiły się losowo.Jak uzyskać losową wartość w słowniku Pythona
dict
wygląda {'VENEZUELA':'CARACAS'}
Jak mogę to zrobić?
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()))
>>> 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).
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
@beepretty dict.keys() zwraca obiekt iterowalny, a nie obiekt podobny do listy. Aby rozwiązać problem, użyj 'random.choice (list (d.keys()))'. – Greenstick
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()
.
'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
no to nie jest praca domowa piszę to, aby mi pomóc z hiszpańskim. – tekknolagi
'random.sample' zwraca' k' losowe _elementy_, 'random.choice' zwraca pojedynczy element losowy – Anentropic
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 dict
doesn'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
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
Zobacz także: http://stackoverflow.com/questions/10593651/pythonic-way-to-access-arbitrary-element-from-dictionary –
python 3.6 dict faktycznie * ORDERED *! To jest bardzo ważne –
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'
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.
To jest niesamowite, wielkie dzięki! –
Spróbuj tego:
import random
a = dict(....) # a is some dictionary
random_key = random.sample(a, 1)[0]
To na pewno działa.
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
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'
Ponieważ oryginalny post chciał parę:
import random
d = {'VENEZUELA':'CARACAS', 'CANADA':'TORONTO'}
country, capital = random.choice(list(d.items()))
(python 3 style)
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)
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ś. –
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
@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
Err about: 'd = {'VENEZUELA': 'CARACAS', 'CANADA': 'OTTAWA'}' Hehe, +1 za bardzo subtelne pranie mózgu ... – gentimouton