214

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.

joaquin
86k31 gold badges146 silver badges155 bronze badges
asked May 12, 2010 at 22:48
0

24 Answers 24

353

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.

John R Perry
4,2222 gold badges45 silver badges70 bronze badges
answered May 12, 2010 at 22:51
Sign up to request clarification or add additional context in comments.

3 Comments

It's actually string.ascii_lowercase or string.ascii_uppercase.
Often, 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)])
@joaquin string.letters is present in python 2.7.7.
88
>>> import random
>>> import string
>>> random.choice(string.ascii_letters)
'g'
answered May 12, 2010 at 22:52

2 Comments

This can be lower or uppercase. Not sure if that is what is needed.
@TaylorLeese, as I have known that there are three options including ascii_letters, ascii_uppercase, and ascii_lowercase.
52
>>>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

answered Jul 31, 2012 at 22:11

3 Comments

also: ''.join(random.sample(string.ascii_lowercase,5))
@Dannid Doesn't random.sample() return a unique set of values from the input, which is not the same as random.choice()?
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)
28
>>> import random
>>> import string 
>>> random.choice(string.ascii_lowercase)
'b'
answered May 12, 2010 at 22:55

Comments

23

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']
answered Nov 30, 2017 at 11:23

2 Comments

@NigelRen what is the distribution of random.choices ?
@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 (en.wikipedia.org/wiki/Discrete_uniform_distribution).
15

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.

George Rappel
7,2563 gold badges47 silver badges59 bronze badges
answered May 12, 2010 at 22:55

4 Comments

That depends on what alphabet we're talking about ;-)
shouldn't it be chr(random.randrange(97, 97 + 26 - 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.
@KieranMoynihan Thanks for sharing. I double checked that and you're right. Now I see why 97 + 26 is used.
7

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])
Smart Manoj
6,0736 gold badges45 silver badges66 bronze badges
answered Jun 16, 2017 at 17:40

Comments

6

This doesn't use any fancy modules but works fine:

 ''.join(chr(random.randrange(65,90)) for i in range(10))
answered Jan 4, 2022 at 14:34

Comments

4
def randchar(a, b):
 return chr(random.randint(ord(a), ord(b)))
answered May 12, 2010 at 22:58

Comments

4
import random
def guess_letter():
 return random.choice('abcdefghijklmnopqrstuvwxyz')
SamB
9,2825 gold badges51 silver badges57 bronze badges
answered Nov 4, 2016 at 13:52

Comments

4

And another, if you pefer numpy over random:

import numpy as np
import string
np.random.choice(list(string.ascii_letters))
answered Aug 14, 2022 at 13:52

Comments

2
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())
answered Apr 18, 2019 at 1:30

Comments

2
#*A handy python password generator*

here is the output

 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)
answered Jul 27, 2021 at 18:34

Comments

1

You can use

map(lambda a : chr(a), np.random.randint(low=65, high=90, size=4))
answered Nov 29, 2018 at 10:50

Comments

1

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']
answered Nov 25, 2020 at 10:04

Comments

0
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
Pang
10.2k146 gold badges87 silver badges126 bronze badges
answered Mar 25, 2016 at 3:15

1 Comment

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?
0
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
Dadep
2,7805 gold badges30 silver badges40 bronze badges
answered May 4, 2018 at 7:13

Comments

0

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:

enter image description here

answered Sep 24, 2018 at 22:28

Comments

0

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)
answered Jun 5, 2023 at 6:27

1 Comment

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.
-1

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)
answered Jan 11, 2018 at 12:06

Comments

-1
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)
AfroThundr
1,2652 gold badges20 silver badges30 bronze badges
answered Feb 13, 2018 at 16:40

Comments

-3

Maybe this can help you:

import random
for a in range(64,90):
 h = random.randint(64, a)
 e += chr(h)
print e
DocZerø
8,60511 gold badges44 silver badges75 bronze badges
answered Aug 4, 2011 at 22:28

1 Comment

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
-3

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.

answered Sep 25, 2018 at 2:03

3 Comments

your answer needs improvement and is not very functional.
in your case you can simply do print(chr(96 + letter)), no if-elif hell is needed
This is if-else hell, It is not a good practice
-6

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
answered Aug 9, 2012 at 3:42

1 Comment

Welcome 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.

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.