patternpythonCritical
Random string generation with upper case letters and digits
Viewed 0 times
randomdigitsletterscaseanduppergenerationstringwith
Problem
How do I generate a string of size N, made of numbers and uppercase English letters such as:
- 6U1S75
- 4Z4UKK
- U911K4
Solution
Answer in one line:
or even shorter starting with Python 3.6 using
A cryptographically more secure version: see this post
In details, with a clean function for further reuse:
How does it work ?
We import
Then we use a list comprehension to create a list of 'n' elements:
In the example above, we use
Instead of asking to create 'n' times the string
Therefore
Then we just join them with an empty string so the sequence becomes a string:
''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N))or even shorter starting with Python 3.6 using
random.choices():''.join(random.choices(string.ascii_uppercase + string.digits, k=N))A cryptographically more secure version: see this post
''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(N))In details, with a clean function for further reuse:
>>> import string
>>> import random
>>> def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
... return ''.join(random.choice(chars) for _ in range(size))
...
>>> id_generator()
'G5G74W'
>>> id_generator(3, "6793YUIO")
'Y3U'How does it work ?
We import
string, a module that contains sequences of common ASCII characters, and random, a module that deals with random generation.string.ascii_uppercase + string.digits just concatenates the list of characters representing uppercase ASCII chars and digits:>>> string.ascii_uppercase
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.digits
'0123456789'
>>> string.ascii_uppercase + string.digits
'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'Then we use a list comprehension to create a list of 'n' elements:
>>> range(4) # range create a list of 'n' numbers
[0, 1, 2, 3]
>>> ['elem' for _ in range(4)] # we use range to create 4 times 'elem'
['elem', 'elem', 'elem', 'elem']In the example above, we use
[ to create the list, but we don't in the id_generator function so Python doesn't create the list in memory, but generates the elements on the fly, one by one (more about this here).Instead of asking to create 'n' times the string
elem, we will ask Python to create 'n' times a random character, picked from a sequence of characters:>>> random.choice("abcde")
'a'
>>> random.choice("abcde")
'd'
>>> random.choice("abcde")
'b'Therefore
random.choice(chars) for _ in range(size) really is creating a sequence of size characters. Characters that are randomly picked from chars:>>> [random.choice('abcde') for _ in range(3)]
['a', 'b', 'b']
>>> [random.choice('abcde') for _ in range(3)]
['e', 'b', 'e']
>>> [random.choice('abcde') for _ in range(3)]
['d', 'a', 'c']Then we just join them with an empty string so the sequence becomes a string:
>>> ''.join(['a', 'b', 'b'])
'abb'
>>> [random.choice('abcde') for _ in range(3)]
['d', 'c', 'b']
>>> ''.join(random.choice('abcde') for _ in range(3))
'dac'Code Snippets
''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N))''.join(random.choices(string.ascii_uppercase + string.digits, k=N))''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(N))>>> import string
>>> import random
>>> def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
... return ''.join(random.choice(chars) for _ in range(size))
...
>>> id_generator()
'G5G74W'
>>> id_generator(3, "6793YUIO")
'Y3U'>>> string.ascii_uppercase
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.digits
'0123456789'
>>> string.ascii_uppercase + string.digits
'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'Context
Stack Overflow Q#2257441, score: 3307
Revisions (0)
No revisions yet.