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.

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.


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'

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


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'

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.


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

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


3
import random
def guess_letter():
    return random.choice('abcdefghijklmnopqrstuvwxyz')

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

1

Puedes usar

map(lambda a : chr(a),  np.random.randint(low=65, high=90, size=4))

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

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

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í


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

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

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


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

¿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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.