Jak mogę uzyskać losową parę z dict
? Tworzę grę, w której musisz odgadnąć stolicę kraju, a pytania powinny pojawiać się losowo.
Że dict
wygląda jak{'VENEZUELA':'CARACAS'}
W jaki sposób mogę to zrobić?
Jak mogę uzyskać losową parę z dict
? Tworzę grę, w której musisz odgadnąć stolicę kraju, a pytania powinny pojawiać się losowo.
Że dict
wygląda jak{'VENEZUELA':'CARACAS'}
W jaki sposób mogę to zrobić?
Odpowiedzi:
Jednym ze sposobów byłoby:
import random
d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}
random.choice(list(d.values()))
EDYCJA : Pytanie zostało zmienione kilka lat po oryginalnym poście i teraz dotyczy pary zamiast pojedynczego elementu. Ostatnia linia powinna teraz wyglądać następująco:
country, capital = random.choice(list(d.items()))
d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}
hehe, +1 za bardzo subtelne pranie mózgu ...
Napisałem to próbując rozwiązać ten sam problem:
https://github.com/robtandy/randomdict
Ma O (1) losowy dostęp do kluczy, wartości i przedmiotów.
Spróbuj tego:
import random
a = dict(....) # a is some dictionary
random_key = random.sample(a, 1)[0]
To zdecydowanie działa.
Jeśli nie chcesz używać random
modułu, możesz również spróbować popitem () :
>> d = {'a': 1, 'b': 5, 'c': 7}
>>> d.popitem()
('a', 1)
>>> d
{'c': 7, 'b': 5}
>>> d.popitem()
('c', 7)
Ponieważ dict
nie zachowuje porządku , używając go popitem
otrzymujesz z niego przedmioty w dowolnej (ale nie ściśle losowej) kolejności.
Pamiętaj też, że popitem
powoduje to usunięcie pary klucz-wartość ze słownika, zgodnie z opisem w dokumentacji .
popitem () jest przydatna do destrukcyjnego iterowania po słowniku
next
nie działa ze słownikiem, ponieważ jest to mapowanie. (Przyszedłem tu po inspirację i to było to).
>>> import random
>>> d = dict(Venezuela = 1, Spain = 2, USA = 3, Italy = 4)
>>> random.choice(d.keys())
'Venezuela'
>>> random.choice(d.keys())
'USA'
Wywołując random.choice na keys
słownika (państwa).
random.choice(list(d.keys()))
.
Jeśli nie chcesz używać random.choice (), możesz 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'
list(…)
tutaj wiele razy. A co powiesz myDictionary_list = list(myDictionary)
?
Ponieważ to jest praca domowa:
Sprawdź, random.sample()
co wybierze i zwróci losowy element z listy. Możesz uzyskać listę kluczy słownika za pomocą dict.keys()
i listę wartości słownika za pomocą dict.values()
.
random.sample
i random.choice
nie może pracować z iteratorami. Muszą znać długość sekwencji, której nie można określić na podstawie iteratora.
random.sample
zwraca elementyk
losowe , zwraca pojedynczy element losowyrandom.choice
Zakładam, że tworzysz aplikację typu quiz. Dla tego rodzaju aplikacji napisałem funkcję, która wygląda 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 podam dane wejściowe questions = {'VENEZUELA':'CARACAS', 'CANADA':'TORONTO'}
i wywołam funkcję, shuffle(questions)
to wynik będzie następujący:
WENEZUELA? CARAKAS KANADA? TORONTO
Możesz to jeszcze bardziej rozszerzyć, tasując również opcje
selected_keys
. Prawdopodobnie powtórzysz to około 100 razy. Przynajmniej usuń zabrane klawisze q jak del(q[current_selection])
- możesz nadpisać q nowym przetasowanym, selected_keys
tak jak q = selected_keys
po wszystkim. Nie zapomnij też o identyfikacji! Alternatywnie spójrz na moje np.random.choice(...)
podejście: stackoverflow.com/a/62843377/4575793
Spróbuj tego (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'
Z nowoczesnych wersjach Pythona (od 3), obiektów zwróconych przez metod dict.keys()
, dict.values()
a dict.items()
to widok obiektów *. I hej można iterować, więc bezpośrednie użycie random.choice
nie jest możliwe, ponieważ teraz nie są one listą ani zestawem.
Jedną z opcji jest użycie listy ze zrozumieniem, aby wykonać zadanie z 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}')
Bibliografia:
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)
Znalazłem ten post szukając raczej porównywalnego rozwiązania. Aby wybrać wiele elementów z dyktu, można tego użyć:
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]
d.keys()
jest listą, ale nie zadziała w Pythonie 3.x, gdzied.keys()
jest iteratorem. Zamiast tego powinieneś to zrobićrandom.choice(list(d.keys()))
.