Reputation: 11
The issue I'm having is that I need to set letters a-z a random unique value from 1 to 26. The same number equalling multiple letters is what I want to avoid. Current methods I have is over 70 lines and is just while loops of each letter to not equal the value given previously for a different letter. Any ideas?
Upvotes: 1
Views: 511
Reputation: 1839
You can use random.shuffle()
(docs) and chr()
(docs) to get your desired outputs.
ASCII lower alphabet characters start from 97.
import random
numbers = list(range(1,27))
random.shuffle(numbers)
for num in numbers:
print(f'Letter={chr(96+num)}, Random Number={num}')
Outputs:
Letter=v, Random Number=22
Letter=t, Random Number=20
Letter=u, Random Number=21
Letter=w, Random Number=23
Letter=f, Random Number=6
Letter=b, Random Number=2
Letter=d, Random Number=4
Letter=h, Random Number=8
Letter=z, Random Number=26
.
.
.
.
You can also use random.sample()
. More info here.
One liner:
result = [(chr(96+num), num) for num in random.sample(list(range(1,27)), 26)]
Outputs:
[('p', 16), ('x', 24), ('d', 4), ('f', 6), ('w', 23), ('z', 26), ('m', 13), ('n', 14), ('b', 2), ('a', 1), ('s', 19), ('q', 17), ('t', 20), ('u', 21), ('h', 8), ('l', 12), ('e', 5), ('k', 11), ('g', 7), ('c', 3), ('v', 22), ('r', 18), ('j', 10), ('i', 9), ('o', 15), ('y', 25)]
Upvotes: 1
Reputation: 24691
Use random.sample()
, which can take any number of unique elements from a given interval. If you take the entire iterable using it, then you get elements in an effectively random order. For example, the following snippet maps the letters in the alphabet to random numbers 1
through 26
, without repeating any.
import random
alphabet = 'abcdefghijklmnopqrstuvwxyz'
numbers = range(1, len(alphabet) + 1)
correspondence = list(zip(alphabet, random.sample(numbers, len(alphabet))))
print(correspondence)
# [('a', 21), ('b', 19), ('c', 2), ('d', 14), ('e', 12), ('f', 3),
# ('g', 8), ('h', 11), ('i', 10), ('j', 4), ('k', 5), ('l', 22),
# ('m', 18), ('n', 20), ('o', 16), ('p', 23), ('q', 1), ('r', 25),
# ('s', 9), ('t', 15), ('u', 26), ('v', 7), ('w', 17), ('x', 24),
# ('y', 6), ('z', 13)]
Upvotes: 2