Jeff Ken
Jeff Ken

Reputation: 11

Python random unique value for multiple variables

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

Answers (2)

Rithin Chalumuri
Rithin Chalumuri

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

Green Cloak Guy
Green Cloak Guy

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

Related Questions