Reputation: 373
Well, the thing is, I had the need to use dictionaries in python, but I realized i couldn't randomly shuffle them. I have to randomly shuffle it, and assign the values to the same dictionary. Any help would be appreciated.
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 < number_of_com:
helper_1 = helper[v]
if helper_1[1] == 0:
win_0.append(helper_1)
elif helper_1[1] == 1:
win_1.append(helper_1)
elif helper_1[1] == 2:
win_2.append(helper_1)
elif helper_1[1] == 3:
win_3.append(helper_1)
elif helper_1[1] == 4:
win_4.append(helper_1)
elif helper_1[1] == 5:
win_5.append(helper_1)
elif helper_1[1] == 6:
win_6.append(helper_1)
elif helper_1[1] == 7:
win_7.append(helper_1)
elif helper_1[1] == 8:
win_8.append(helper_1)
elif helper_1[1] == 9:
win_9.append(helper_1)
elif helper_1[1] == 10:
win_10.append(helper_1)
v += 1
random.shuffle(win_0)
random.shuffle(win_1)
random.shuffle(win_2)
random.shuffle(win_3)
random.shuffle(win_4)
random.shuffle(win_5)
random.shuffle(win_6)
random.shuffle(win_7)
random.shuffle(win_8)
random.shuffle(win_9)
random.shuffle(win_10)
while len(helper) > 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 < number_of_com:
helper_1 = helper[v]
if helper_1[1] == 0:
win_0.append(helper_1)
elif helper_1[1] == 1:
win_1.append(helper_1)
elif helper_1[1] == 2:
win_2.append(helper_1)
elif helper_1[1] == 3:
win_3.append(helper_1)
elif helper_1[1] == 4:
win_4.append(helper_1)
elif helper_1[1] == 5:
win_5.append(helper_1)
elif helper_1[1] == 6:
win_6.append(helper_1)
elif helper_1[1] == 7:
win_7.append(helper_1)
elif helper_1[1] == 8:
win_8.append(helper_1)
elif helper_1[1] == 9:
win_9.append(helper_1)
elif helper_1[1] == 10:
win_10.append(helper_1)
v += 1
random.shuffle(win_0)
random.shuffle(win_1)
random.shuffle(win_2)
random.shuffle(win_3)
random.shuffle(win_4)
random.shuffle(win_5)
random.shuffle(win_6)
random.shuffle(win_7)
random.shuffle(win_8)
random.shuffle(win_9)
random.shuffle(win_10)
while len(helper) > 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
Upvotes: 21
Views: 82391
Reputation: 106543
If you're using Python 3.7+, where dicts are officially ordered, you can convert the dict items to a list of tuples for shuffling before converting it back to a dict with the dict()
constructor:
import random
d = {"a": 1, "b": 2, "c": 3, "d": 4}
# This shuffling is not in-place
l = list(d.items())
random.shuffle(l)
d_shuffled = dict(l)
Upvotes: 48
Reputation: 698
A one-line method to select random keys from a dict, and create a new dict with the random-key order:
import random
random.seed(0)
d = dict(a=1,b=2,c=3,d=4)
x = {k:d[k] for k in random.sample(list(d.keys()), len(d))}
>>> print(d)
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> print(x)
{'d': 4, 'b': 2, 'a': 1, 'c': 3}
Upvotes: 0
Reputation: 91
Simple idea to randomly shuffling a dictionary is use set. Even You don't need library random.
d = {'a':'1','b':'2','c':'3','d':'4'}
d_set = list(set(d))
d = {i:d[i] for i in d_set}
Upvotes: 0
Reputation: 407
I saw that guys twisted this simple question (if I get it though). To shuffle the contents of a dictionary lets say
a={'a':1,'b':2,'c':3}
we can do in three simple steps:
listing the items of given dictionary
a1 = list(a.items())
Out[1]: [('a', 1), ('b', 2), ('c', 3)]
shuffling the items list
numpy.random.shuffle(a1)
Out[2]: [('b', 2), ('c', 3), ('a', 1)]
getting shuffled dictionary
a = dict(a1)
Out[3]: {'b': 2, 'c': 3, 'a': 1}
Upvotes: 4
Reputation: 1006
Well I think that you can also do it simpler, without 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')]
I think that using shuffle makes the code clearer then using sorted with random key.
For shuffling keys only it would make something like:
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')])
Upvotes: 5
Reputation: 1882
You can't order the built-in dict
, but in the collections
module there is 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)])
Upvotes: 0
Reputation: 1882
Randomly assign keys to values:
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)
Output
{'a': 1, 'c': 4, 'b': 2, 'd': 3}
Upvotes: -1
Reputation: 336138
You can't reshuffle a dictionary. What you can do is create a list of the dictionary's keys and shuffle that in order to achieve a new arbitrary order in which to access the dictionary's contents:
>>> 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)]
Upvotes: 65