2011-10-16 15 views

risposta

18

Un dict è un insieme non ordinato di coppie di valori-chiave. Quando si itera un dict, è effettivamente casuale. Ma per randomizzare esplicitamente la sequenza di coppie chiave-valore, è necessario lavorare con un oggetto diverso che è ordinato, come una lista. dict.items(), dict.keys(), e dict.values() ogni ritorno liste, che possono essere mescolate.

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] 

Oppure, se non si preoccupano i tasti:

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

Potete anche "ordina per casuale":

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

In python3, 'd.Items()', 'd.keys()' e 'd.values ​​()' producono un oggetto iteratore. È necessario convertire esplicitamente quell'iteratore in elenco usando la funzione 'list()'. –

+0

"Quando si itera un' dict', è effettivamente casuale "- non lo è. Fare affidamento su di esso per sembrare anche casuali sarebbe una cattiva idea, considerando che cose come gli Ints sono molto probabili che escano in ordine. Inoltre, l'ordinamento a chiave casuale è O (nlog (n)) invece di O (n), quindi dovrebbe probabilmente essere evitato. – user2357112

+0

Come si adatterebbe questo per mescolare sempre il dizionario (mantenendo i collegamenti tra il tasto giusto al valore giusto nello stesso modo, ad esempio usando 'np.random.RandomState (100)'? –

7

Non è possibile. Ottieni l'elenco delle chiavi con .keys(), mischiale, quindi esegui un'iterazione nell'elenco durante l'indicizzazione del dettato originale.

Oppure utilizzare .items(), e shuffle e iterare questo.

+0

o 'dict.values ​​()', se invece si è i valori. –

0

Come Charles Brunet hanno già detto che il dizionario è una disposizione casuale di coppie di valori chiave. Ma per renderlo davvero casuale utilizzerai un modulo casuale. Ho scritto una funzione che provvederà a mischiare tutte le chiavi e così mentre si sta scorrendo che sarà l'iterazione in modo casuale. Si può comprendere più chiaramente vedendo il codice:

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 

Ora, quando si chiama la funzione basta passare il parametro (il nome del dizionario che si desidera mescolare) e si otterrà un elenco di chiavi che vengono mescolate. Infine puoi creare un loop per la lunghezza dell'elenco e usare name_of_dictionary[key] per ottenere il valore. Spero che questo aggiungerà un valore a questo stack :)

Source: Radius Of Circle

Problemi correlati