Aleatoriamente un diccionario en Python

Bueno, el problema es que tuve la necesidad de usar diccionarios en python, pero me di cuenta de que no podía barajarlos al azar. Tengo que mezclarlo aleatoriamente y asignar los valores al mismo diccionario. Cualquier ayuda sería apreciada.

import random i = 1 name = "" helper = [] number_of_com = 0 win_0 = [] win_1 = [] win_2 = [] win_3 = [] win_4 = [] win_5 = [] win_6 = [] win_7 = [] win_8 = [] win_9 = [] win_10 = [] print ("Welcome to the Swiss Round Calculator. This project was made by Enes Kristo") number_of_com = int(input("Please enter the number of the competitors:\n")) if number_of_com <= 16: loop = 3 elif number_of_com <= 32: loop = 4 elif number_of_com <= 64: loop = 5 elif number_of_com <= 128: loop = 6 elif number_of_com <= 256: loop = 7 elif number_of_com <= 512: loop = 8 elif number_of_com <= 1024: loop = 9 else: loop = 10 while i <= number_of_com: name = str(input("Name of competitor nr."+str(i)+":\n")) helper.append([name, 0, 0]) i += 1 def odd(): b = 0 while b <= (number_of_com - 2): helper_1 = helper[b] b += 1 helper_2 = helper[b] print ("Player " + str(helper_1[0]) + " is vs player " + str(helper_2[0]) + ".") b += 1 helper_3 = helper[(number_of_com-1)] print (str(helper_3[0])+" gets a free win.") helper_3[1] += 1 helper[(number_of_com-1)] = helper_3 b = 0 while b <= (number_of_com - 2): helper_1 = helper[b] b += 1 helper_2 = helper[b] print("In the match between player " + str(helper_1[0]) + " and player " +str(helper_2[0]) + " who won?") a = int(input("Enter 1 if player " + str(helper_1[0]) + " won or 2 if player " + str(helper_2[0]) + " won.\n")) if a == 1 or a == 2: if a == 1: helper_1[1] += 1 helper_2[2] += 1 b -= 1 helper[b] = helper_1 b += 1 helper[b] = helper_2 else: helper_1[2] += 1 helper_2[1] += 1 b -= 1 helper[b] = helper_1 b += 1 helper[b] = helper_2 else: print("Enter a correct number.") b -= 1 continue b += 1 random.shuffle(helper) v = 0 while v  0: helper.pop() helper.append(win_10) helper.append(win_9) helper.append(win_8) helper.append(win_7) helper.append(win_6) helper.append(win_5) helper.append(win_4) helper.append(win_3) helper.append(win_2) helper.append(win_1) helper.append(win_0) def even(): b = 0 while b <= (number_of_com - 2): helper_1 = helper[b] b += 1 helper_2 = helper[b] print ("Player " + str(helper_1[0]) + " is vs player " +str(helper_2[0]) + ".") b += 1 b = 0 while b <= (number_of_com - 2): helper_1 = helper[b] b += 1 helper_2 = helper[b] print("In the match between player " + str(helper_1[0]) + " and player " +str(helper_2[0]) + " who won?") a = int(input("Enter 1 if player " + str(helper_1[0]) + " won or 2 if player " + str(helper_2[0]) + " won.")) if a == 1 or a == 2: if a == 1: helper_1[1] += 1 helper_2[2] += 1 b -= 1 helper[b] = helper_1 b += 1 helper[b] = helper_2 else: helper_1[2] += 1 helper_2[1] += 1 b -= 1 helper[b] = helper_1 b += 1 helper[b] = helper_2 else: print("Enter a correct number.") b -= 1 continue b += 1 random.shuffle(helper) v = 0 while v  0: helper.pop() helper.append(win_10) helper.append(win_9) helper.append(win_8) helper.append(win_7) helper.append(win_6) helper.append(win_5) helper.append(win_4) helper.append(win_3) helper.append(win_2) helper.append(win_1) helper.append(win_0) if number_of_com % 2 == 0: c = 1 while c <= loop: even() c += 1 else: c = 1 while c <= loop: odd() c += 1 

No puedes reorganizar un diccionario. Lo que puede hacer es crear una lista de las claves del diccionario y barajarlas para lograr un nuevo orden arbitrario en el que acceder a los contenidos del diccionario:

 >>> import random >>> d = {1:2, 3:4, 5:6, 7:8, 9:10} >>> d {1: 2, 3: 4, 9: 10, 5: 6, 7: 8} >>> keys = list(d.keys()) # Python 3; use keys = d.keys() in Python 2 >>> random.shuffle(keys) >>> [(key, d[key]) for key in keys] [(1, 2), (5, 6), (7, 8), (9, 10), (3, 4)] >>> random.shuffle(keys) >>> [(key, d[key]) for key in keys] [(9, 10), (3, 4), (1, 2), (7, 8), (5, 6)] >>> random.shuffle(keys) >>> [(key, d[key]) for key in keys] [(1, 2), (7, 8), (3, 4), (5, 6), (9, 10)] 

Bueno, creo que también puedes hacerlo más simple, sin lambdas, etc .:

 from random import shuffle from collections import OrderedDict a = {num-97:chr(num) for num in range(97, 107)} # a = {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j'} b = list(a.items()) shuffle(b) a = OrderedDict(b) #Or just stay with b # a = OrderedDict([(1, 'b'), (6, 'g'), (4, 'e'), (3, 'd'), (5, 'f'), (8, 'i'), (2, 'c'), (7, 'h'), (9, 'j'), (0, 'a')]) # b = [(1, 'b'), (6, 'g'), (4, 'e'), (3, 'd'), (5, 'f'), (8, 'i'), (2, 'c'), (7, 'h'), (9, 'j'), (0, 'a')] 

Creo que usar Shuffle hace que el código sea más claro que usar ordenado con clave aleatoria.

Para barajar teclas solo haría algo como:

 keys = list(a.keys()) shuffle(keys) OrderedDict(zip(keys, a.values())) # OrderedDict([(3, 'a'), (1, 'b'), (9, 'c'), (4, 'd'), (6, 'e'), (8, 'f'), (0, 'g'), (2, 'h'), (5, 'i'), (7, 'j')]) 

No puede pedir el OrderedDict incorporado, pero en el módulo de collections está OrderedDict :

 >>> from collections import OrderedDict >>> from random import random >>> od = OrderedDict(a=1, b=2, c=3, d=4) >>> # sorts a list by whatever the key-callable returns => its randomly sorted >>> shuffled_key_value_list = sorted(od.items(), key=lambda x: random()) >>> shuffled_key_value_list # (this might also do it) [('d', 4), ('c', 3), ('a', 1), ('b', 2)] >>> OrderedDict(shuffled_key_value_list) OrderedDict([('d', 4), ('c', 3), ('a', 1), ('b', 2)]) 

Asignar aleatoriamente claves a los valores:

 from random import shuffle x = dict(a=1, b=2, c=3, d=4) # py2.7 values = x.values() # py3.* values = list( x.values() ) # It does not make any difference, whether values or keys are shuffled # but it could lead to wrong conclusions to shuffle the keys. shuffle(values) y = dict(zip(x.keys(), values)) # py2.7 print y # py3.* print(y) 

Salida

 {'a': 1, 'c': 4, 'b': 2, 'd': 3} 

Vi que los chicos retorcieron esta simple pregunta (si la consigo, sin embargo). Para barajar los contenidos de un diccionario, digamos

 a={'a':1,'b':2,'c':3} 

Lo podemos hacer en tres simples pasos:

  1. listando los artículos del diccionario dado

    a1 = lista (a.items ())

    Fuera [1]: [(‘a’, 1), (‘b’, 2), (‘c’, 3)]

  2. barajando la lista de artículos

    numpy.random.shuffle (a1)

    Fuera [2]: [(‘b’, 2), (‘c’, 3), (‘a’, 1)]

  3. conseguir el diccionario barajado

    a = dict (a1)

    Fuera [3]: {‘b’: 2, ‘c’: 3, ‘a’: 1}

Si está utilizando Python 3.7, donde los decretos están ordenados oficialmente, puede convertir los elementos dict en una lista de tuplas para barajar antes de convertirlos nuevamente en un dict con el constructor dict() :

 import random d = {'a':1, 'b':2, 'c':3, 'd':4} l = list(d.items()) random.shuffle(l) d = dict(l)