2011-10-16 18 views

Odpowiedz

18

A dict to nieuporządkowany zestaw par klucz-wartość. Podczas iteracji dict, jest to efektywnie losowe. Aby jednak jawnie wybrać losowo sekwencję par klucz-wartość, należy pracować z innym obiektem, który jest zamawiany, na przykład z listą. dict.items(), dict.keys() i dict.values() każda lista zwrotów, które można tasować.

items=d.items() # List of tuples 
random.shuffle(items) 
for key, value in items: 
    print key, value 

keys=d.keys() # List of keys 
random.shuffle(keys) 
for key in keys: 
    print key, d[key] 

Lub, jeśli nie dbają o kluczy:

values=d.values() # List of values 
random.shuffle(values) # Shuffles in-place 
for value in values: 
    print value 

Można również "sort przez random":

for key, value in sorted(d.items(), key=lambda x: random.random()): 
    print key, value 
+8

W języku Python3, 'd.items()', 'd.keys()' i 'd.values ​​()' tworzą obiekt iteratora. Musisz jawnie przekonwertować ten iterator na listę używając funkcji 'list()'. –

+0

"Podczas iteracji" dyktatu ", jest on faktycznie losowy" - nie jest. Poleganie na tym, aby wyglądać na przypadkowo byłoby złym pomysłem, biorąc pod uwagę, że rzeczy takie jak int są dość prawdopodobne, że wyjdą w uporządkowanej kolejności. Ponadto sortowanie losowe to O (nlog (n)) zamiast O (n), więc prawdopodobnie powinno się go unikać. – user2357112

+0

Jak to zaadaptować, aby zawsze przetasować słownik (zachowując połączenia między prawym kluczem do odpowiedniej wartości w ten sam sposób, na przykład używając 'np.random.RandomState (100)'? –

7

Nie możesz. Uzyskaj listę kluczy z numerem .keys(), przetasuj je, a następnie przejrzyj listę podczas indeksowania oryginalnego dokumentu.

Lub użyj .items(), a następnie przetasuj i powtórz to.

+0

lub 'dict.values ​​()' jeśli chcesz to wartości. –

0

Jak Charles Brunet już, że w słowniku jest losowym układem par wartości klucza. Ale aby było naprawdę losowo, użyjesz losowego modułu. Napisałem funkcję, która przetasuje wszystkie klawisze, a więc podczas iteracji przez nią będzie się powtarzać losowo. Można zrozumieć jaśniej widząc kod:

def shuffle(q): 
    """ 
    This function is for shuffling 
    the dictionary elements. 
    """ 
    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 
    return selected_keys 

Teraz po wywołaniu funkcji prostu przekazać parametr (nazwę słownika, który chcesz Shuffle), a otrzymasz listę kluczy, które są tasuje. Na koniec możesz utworzyć pętlę dla długości listy i użyć wartości name_of_dictionary[key]. nadzieję, że będzie dodać wartość do tego stosu :)

Source: Radius Of Circle

Powiązane problemy