Genera una letra aleatoria en Python

147

¿Hay alguna manera de generar letras aleatorias en Python (como random.randint pero para letras)? La funcionalidad de rango de random.randint sería buena, pero tener un generador que solo genere una letra aleatoria sería mejor que nada.

Kudu
fuente

Respuestas:

247

Sencillo:

>>> import string
>>> string.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> import random
>>> random.choice(string.ascii_letters)
'j'

string.ascii_letters devuelve una cadena que contiene las letras minúsculas y mayúsculas según la configuración regional actual.

random.choice devuelve un único elemento aleatorio de una secuencia.

Mark Rushakoff
fuente
12
En realidad es string.ascii_lowercase o string.ascii_uppercase.
Taylor Leese
9
A menudo, necesito una serie de randoms, aquí está eso (después from string import ascii_letters, digitsy from random import choice):''.join([choice(ascii_letters + digits) for i in range(32)])
Devin
77
@joaquin string.letters está presente en python 2.7.7.
Wilson Canda
70
>>> import random
>>> import string
>>> random.choice(string.ascii_letters)
'g'
joaquin
fuente
Esto puede ser inferior o mayúscula. No estoy seguro si eso es lo que se necesita.
Taylor Leese
3
@TaylorLeese, como he sabido que hay tres opciones, entre ellas ascii_letters, ascii_uppercasey ascii_lowercase.
Trdngy
29
>>>def random_char(y):
       return ''.join(random.choice(string.ascii_letters) for x in range(y))

>>>print (random_char(5))
>>>fxkea

para generar y número de caracteres aleatorios

Saad
fuente
77
también:''.join(random.sample(string.ascii_lowercase,5))
Dannid
@Dannid No random.sample()devuelve un conjunto único de valores de la entrada, que no es lo mismo que random.choice()?
Droppy
Sí, aunque si está eligiendo solo una letra que no hace la diferencia Además, es posible que desee 5 letras únicas: el OP no especificó, y ambas random.choicey random.randintdevuelven un solo valor. También puede usar numpy.random.choicepara dar un conjunto único si agrega replace = False, así:numpy.random.choice(string.ascii_lowercase, size=5, replace=False)
Dannid
21
>>> import random
>>> import string    
>>> random.choice(string.ascii_lowercase)
'b'
Taylor Leese
fuente
13

Otra forma, para completar:

>>> chr(random.randrange(97, 97 + 26))

Use el hecho de que ascii'a' es 97, y hay 26 letras en el alfabeto.

Al determinar el límite superior e inferior de la random.randrange()llamada a la función, recuerde que random.randrange()es exclusivo en su límite superior, lo que significa que solo generará un entero de hasta 1 unidad menos que el valor proporcionado.

rlotun
fuente
3
Eso depende de qué alfabeto estamos hablando ;-)
Joey
no debería ser chr(random.randrange(97, 97 + 26 - 1))?
zhongxiao37
1
@ zhongxiao37 Realmente, debería serlo chr(random.randrange(97, 97 + 26). random.randrange()es exclusivo en su límite superior, lo que significa que para obtener el rango completo de caracteres 97 - 122, el argumento pasado debe ser 123.
Kieran Moynihan
@KieranMoynihan Gracias por compartir. Lo comprobé dos veces y tienes razón. Ahora veo por qué 97 + 26se usa.
zhongxiao37
6

Puede usar esto para obtener una o más letras aleatorias

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']
salhin
fuente
@NigelRen, ¿cuál es la distribución de random.choices?
Jimmy
@SalmanLashkarara help(random.choices)afirma If the relative weights or cumulative weights are not specified, the selections are made with equal probability.Esto significaría que la distribución es la distribución uniforme discreta ( en.wikipedia.org/wiki/Discrete_uniform_distribution ).
Qaswed
5

Solo puedes hacer una lista:

import random
list1=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
b=random.randint(0,7)
print(list1[b])
Athreya
fuente
4
def randchar(a, b):
    return chr(random.randint(ord(a), ord(b)))
Florian Diesch
fuente
3
import random
def guess_letter():
    return random.choice('abcdefghijklmnopqrstuvwxyz')
Toby
fuente
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())
Vaibhav Pthak
fuente
1

Puedes usar

map(lambda a : chr(a),  np.random.randint(low=65, high=90, size=4))
Ankit Agrawal
fuente
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))

Puede obtener cadenas aleatorias como esta:

g9CtUljUWD9wtk1z07iF
ndPbI1DDn6UvHSQoDMtd
klMFY3pTYNVWsNJ6cs34
Qgr7OEalfhXllcFDGh2l
王孝先
fuente
1. Con Python3, sería string.ascii_letters2. Puede guardar la comprensión de la lista usando keylist = random.choices(base_str(), k=KEY_LEN)3. ¿Por qué tener base_struna función y no una base_str = string.ascii_letters+string.digits?
Qaswed
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
usuario9739613
fuente
0

Todas las respuestas anteriores son correctas, si está buscando caracteres aleatorios de varios tipos (es decir, caracteres alfanuméricos y especiales), aquí hay un script que creé para demostrar varios tipos de creación de funciones aleatorias, tiene tres funciones, una para números, alfa- personajes y personajes especiales. El script simplemente genera contraseñas y es solo un ejemplo para demostrar varias formas de generar caracteres aleatorios.

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

Resultado:

ingrese la descripción de la imagen aquí

grepit
fuente
-1

bueno, esta es mi respuesta! Funciona bien. Simplemente ponga el número de letras al azar que desea en 'número' ... (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)
David W. Beck
fuente
-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)
Jack Honor
fuente
-1

Mi código demasiado complicado:

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')

Básicamente genera un número aleatorio de 26 y luego se convierte en su letra correspondiente. Esto definitivamente podría mejorarse, pero solo soy un principiante y estoy orgulloso de este código.

Nit Nurray
fuente
44
Su respuesta necesita mejoras y no es muy funcional.
Grepit
1
en su caso, simplemente puede hacer print(chr(96 + letter)), no if- elifse necesita el infierno
Azat Ibrakov
-3

Tal vez esto pueda ayudarle:

import random
for a in range(64,90):
    h = random.randint(64, a)
    e += chr(h)
print e
Peter
fuente
¿Por qué estás iterando entre 64 y 90? ¿Por qué no simplemente pasar de 0 a 26 y compensar a? Esta respuesta es bastante pobre, la salida casi al azar:@AAADCCEHFGJLDJF@EHFMHKWUR
Matt M.
-6

Coloque una pitón en el teclado y deje que pase sobre las letras hasta que encuentre su combo aleatorio preferido ¡Es broma!

import string #This was a design above but failed to print. I remodled it.
import random
irandom = random.choice(string.ascii_letters) 
print irandom
Chirstian Bolovinchi
fuente
2
¡Bienvenido a Stack Overflow! Si bien esta es una buena respuesta, es idéntica a la respuesta ya publicada y aceptada por @MarkRushakoff, respondida hace dos años. Revise las respuestas antes de publicar para que podamos mantener baja la relación señal / ruido.
Enganchado el