Is there a way to generate random letters in Python (like random.randint but for letters)? The range functionality of random.randint would be nice but having a generator that just outputs a random letter would be better than nothing.
24 Answers
Simple:
>>> import string
>>> string.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> import random
>>> random.choice(string.ascii_letters)
'j'
string.ascii_letters
returns a string containing the lower case and upper case letters according to the current locale.
random.choice
returns a single, random element from a sequence.

- 3,916
- 2
- 38
- 62

- 249,864
- 45
- 407
- 398
-
14It's actually string.ascii_lowercase or string.ascii_uppercase. – Taylor Leese May 12 '10 at 22:54
-
11Often, I need a string of randoms, here's that (after `from string import ascii_letters, digits` and `from random import choice`): `''.join([choice(ascii_letters + digits) for i in range(32)])` – Devin Dec 05 '13 at 17:41
-
7@joaquin string.letters is present in python 2.7.7. – Wilson Canda Jul 28 '14 at 18:48
>>> import random
>>> import string
>>> random.choice(string.ascii_letters)
'g'

- 82,968
- 29
- 138
- 152
-
This can be lower or uppercase. Not sure if that is what is needed. – Taylor Leese May 12 '10 at 22:55
-
9@TaylorLeese, as I have known that there are three options including `ascii_letters`, `ascii_uppercase`, and `ascii_lowercase`. – Uvuvwevwevwe May 18 '18 at 11:17
>>>def random_char(y):
return ''.join(random.choice(string.ascii_letters) for x in range(y))
>>>print (random_char(5))
>>>fxkea
to generate y number of random characters

- 1,856
- 1
- 22
- 28
-
10
-
@Dannid Doesn't `random.sample()` return a *unique* set of values from the input, which is not the same as `random.choice()`? – Droppy Apr 26 '17 at 07:07
-
Yes, though if you're choosing just one letter that doesn't make a difference Furthermore, you may want 5 unique letters - the OP didn't specify, and both `random.choice` and `random.randint` return a single value. You can also use `numpy.random.choice` to give a unique set if you add replace=False, like so: `numpy.random.choice(string.ascii_lowercase, size=5, replace=False)` – Dannid Apr 26 '17 at 17:31
-
-
-
>>> import random
>>> import string
>>> random.choice(string.ascii_lowercase)
'b'

- 51,004
- 28
- 112
- 141
You can use this to get one or more random letter(s)
import random
import string
random.seed(10)
letters = string.ascii_lowercase
rand_letters = random.choices(letters,k=5) # where k is the number of required rand_letters
print(rand_letters)
['o', 'l', 'p', 'f', 'v']

- 2,454
- 3
- 37
- 64
-
-
@SalmanLashkarara `help(random.choices)` states `If the relative weights or cumulative weights are not specified, the selections are made with equal probability.` This would mean, that the distribution is the discrete uniform distribution (https://en.wikipedia.org/wiki/Discrete_uniform_distribution). – Qaswed Oct 30 '19 at 09:07
Another way, for completeness:
>>> chr(random.randrange(97, 97 + 26))
Use the fact that ascii
'a' is 97, and there are 26 letters in the alphabet.
When determining the upper and lower bound of the random.randrange()
function call, remember that random.randrange()
is exclusive on its upper bound, meaning it will only ever generate an integer up to 1 unit less that the provided value.
-
3
-
-
1@zhongxiao37 Really, it should be `chr(random.randrange(97, 97 + 26)`. `random.randrange()` is exclusive on its upper bound, meaning that in order to get the whole range of characters `97 - 122`, the argument passed must be `123`. – Kieran Moynihan Apr 04 '19 at 17:52
-
@KieranMoynihan Thanks for sharing. I double checked that and you're right. Now I see why `97 + 26` is used. – zhongxiao37 Apr 08 '19 at 08:33
You can just make a list:
import random
list1=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
b=random.randint(0,7)
print(list1[b])

- 5,230
- 4
- 34
- 59

- 111
- 2
- 11
This doesn't use any fancy modules but works fine:
''.join(chr(random.randrange(65,90)) for i in range(10))

- 61
- 2
- 4
import random
def Random_Alpha():
l = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
return l[random.randint(0,25)]
print(Random_Alpha())

- 21
- 1
#*A handy python password generator*
import random
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
symbols = ['!', '#', '$', '%', '&', '(', ')', '*', '+']
print("Welcome to the Python Password Generator!")
l= int(input("How many letters would you like in your password?\n"))
s = int(input(f"How many symbols would you like?\n"))
n = int(input(f"How many numbers would you like?\n"))
sequence = random.sample(letters,l)
num = random.sample(numbers,n)
sym = random.sample(symbols,s)
sequence.extend(num)
sequence.extend(sym)
random.shuffle(sequence)
password = ''.join([str(elem) for elem in sequence])#listToStr
print(password)

- 31
- 5
And another, if you pefer numpy
over random
:
import numpy as np
import string
np.random.choice(list(string.ascii_letters))

- 1,091
- 2
- 10
- 20
You can use
map(lambda a : chr(a), np.random.randint(low=65, high=90, size=4))

- 891
- 9
- 27

- 11
- 1
- 4
A summary and improvement of some of the answers.
import numpy as np
n = 5
[chr(i) for i in np.random.randint(ord('a'), ord('z') + 1, n)]
# ['b', 'f', 'r', 'w', 't']

- 2,065
- 1
- 16
- 22
import string
import random
KEY_LEN = 20
def base_str():
return (string.letters+string.digits)
def key_gen():
keylist = [random.choice(base_str()) for i in range(KEY_LEN)]
return ("".join(keylist))
You can get random strings like this:
g9CtUljUWD9wtk1z07iF
ndPbI1DDn6UvHSQoDMtd
klMFY3pTYNVWsNJ6cs34
Qgr7OEalfhXllcFDGh2l
-
1. With Python3, it would be `string.ascii_letters` 2. You can save the list comprehension by using `keylist = random.choices(base_str(), k=KEY_LEN)` 3. Why having `base_str` as a function and not a `base_str = string.ascii_letters+string.digits`? – Qaswed Oct 30 '19 at 13:59
def create_key(key_len):
key = ''
valid_characters_list = string.letters + string.digits
for i in range(key_len):
character = choice(valid_characters_list)
key = key + character
return key
def create_key_list(key_num):
keys = []
for i in range(key_num):
key = create_key(key_len)
if key not in keys:
keys.append(key)
return keys

- 2,796
- 5
- 27
- 40
All previous answers are correct, if you are looking for random characters of various types (i.e. alphanumeric and special characters) then here is an script that I created to demonstrate various types of creating random functions, it has three functions one for numbers, alpha- characters and special characters. The script simply generates passwords and is just an example to demonstrate various ways of generating random characters.
import string
import random
import sys
#make sure it's 3.7 or above
print(sys.version)
def create_str(str_length):
return random.sample(string.ascii_letters, str_length)
def create_num(num_length):
digits = []
for i in range(num_length):
digits.append(str(random.randint(1, 100)))
return digits
def create_special_chars(special_length):
stringSpecial = []
for i in range(special_length):
stringSpecial.append(random.choice('!$%&()*+,-.:;<=>?@[]^_`{|}~'))
return stringSpecial
print("how many characters would you like to use ? (DO NOT USE LESS THAN 8)")
str_cnt = input()
print("how many digits would you like to use ? (DO NOT USE LESS THAN 2)")
num_cnt = input()
print("how many special characters would you like to use ? (DO NOT USE LESS THAN 1)")
s_chars_cnt = input()
password_values = create_str(int(str_cnt)) +create_num(int(num_cnt)) + create_special_chars(int(s_chars_cnt))
#shuffle/mix the values
random.shuffle(password_values)
print("generated password is: ")
print(''.join(password_values))
Result:

- 21,260
- 6
- 105
- 81
Example of generating letters and numbers together
import random
import string
for_seed = random.randint(1,1000)
random.seed(for_seed)
def create_alphanumerical_randomly(n):
my_letters = string.ascii_lowercase
my_rand_letters = random.choices(my_letters, k=n)
my_string = ""
for letter in my_rand_letters:
my_string += letter
return my_string + str(for_seed)
my_func = create_alphanumerical_randomly(3)
print(my_func)

- 1
- 1
-
Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – LinFelix Jun 05 '23 at 08:31
well, this is my answer! It works well. Just put the number of random letters you want in 'number'... (Python 3)
import random
def key_gen():
keylist = random.choice('abcdefghijklmnopqrstuvwxyz')
return keylist
number = 0
list_item = ''
while number < 20:
number = number + 1
list_item = list_item + key_gen()
print(list_item)

- 182
- 1
- 9
import string
import random
def random_char(y):
return ''.join(random.choice(string.ascii_letters+string.digits+li) for x in range(y))
no=int(input("Enter the number of character for your password= "))
li = random.choice('!@#$%^*&( )_+}{')
print(random_char(no)+li)

- 1,175
- 2
- 17
- 28

- 11
My overly complicated piece of code:
import random
letter = (random.randint(1,26))
if letter == 1:
print ('a')
elif letter == 2:
print ('b')
elif letter == 3:
print ('c')
elif letter == 4:
print ('d')
elif letter == 5:
print ('e')
elif letter == 6:
print ('f')
elif letter == 7:
print ('g')
elif letter == 8:
print ('h')
elif letter == 9:
print ('i')
elif letter == 10:
print ('j')
elif letter == 11:
print ('k')
elif letter == 12:
print ('l')
elif letter == 13:
print ('m')
elif letter == 14:
print ('n')
elif letter == 15:
print ('o')
elif letter == 16:
print ('p')
elif letter == 17:
print ('q')
elif letter == 18:
print ('r')
elif letter == 19:
print ('s')
elif letter == 20:
print ('t')
elif letter == 21:
print ('u')
elif letter == 22:
print ('v')
elif letter == 23:
print ('w')
elif letter == 24:
print ('x')
elif letter == 25:
print ('y')
elif letter == 26:
print ('z')
It basically generates a random number out of 26 and then converts into its corresponding letter. This could defiantly be improved but I am only a beginner and I am proud of this piece of code.
-
4
-
1in your case you can simply do `print(chr(96 + letter))`, no `if`-`elif` hell is needed – Azat Ibrakov Sep 25 '18 at 08:24
-
Maybe this can help you:
import random
for a in range(64,90):
h = random.randint(64, a)
e += chr(h)
print e
-
Why are you iterating between 64 and 90? Why not just go from 0 to 26, and offset a? This answer is quite poor, the output hardly random: `@AAADCCEHFGJLDJF@EHFMHKWUR` – Mattwmaster58 Mar 31 '20 at 23:13
Place a python on the keyboard and let him roll over the letters until you find your preferd random combo Just kidding!
import string #This was a design above but failed to print. I remodled it.
import random
irandom = random.choice(string.ascii_letters)
print irandom
-
4Welcome to Stack Overflow! While this is a good answer it is _identical_ to the already posted and accepted answer by @MarkRushakoff, answered two years ago. Please review the answers before you post so we can keep the signal to noise ratio down. – Hooked Aug 09 '12 at 04:58