Genera una lettera casuale in Python


147

C'è un modo per generare lettere casuali in Python (come random.randint ma per le lettere)? La funzionalità di intervallo di random.randint sarebbe buona, ma avere un generatore che emette solo una lettera casuale sarebbe meglio di niente.

Risposte:


247

Semplice:

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

string.ascii_letters restituisce una stringa contenente le lettere minuscole e maiuscole in base alla locale corrente.

random.choice restituisce un singolo elemento casuale da una sequenza.


12
In realtà è string.ascii_lowercase o string.ascii_uppercase.
Taylor Leese,

9
Spesso, ho bisogno di una serie di randoms, ecco che (dopo from string import ascii_letters, digitse from random import choice):''.join([choice(ascii_letters + digits) for i in range(32)])
Devin il

7
@joaquin string.letters è presente in Python 2.7.7.
Wilson Canda,

70
>>> import random
>>> import string
>>> random.choice(string.ascii_letters)
'g'

Questo può essere inferiore o maiuscolo. Non sono sicuro se questo è ciò che è necessario.
Taylor Leese,

3
@TaylorLeese, come ho saputo che ci sono tre opzioni tra cui ascii_letters, ascii_uppercase, e 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

per generare un numero y di caratteri casuali


7
anche:''.join(random.sample(string.ascii_lowercase,5))
Dannid,

@Dannid Non random.sample()restituisce un set univoco di valori dall'input, che non è uguale a random.choice()?
Droppy il

Sì, anche se stai scegliendo una sola lettera che non fa differenza. Inoltre, potresti volere 5 lettere univoche - l'OP non ha specificato, e entrambe random.choicee random.randintrestituiscono un singolo valore. Puoi anche usare numpy.random.choiceper dare un set unico se aggiungi sostituisci = Falso, in questo modo:numpy.random.choice(string.ascii_lowercase, size=5, replace=False)
Dannid

21
>>> import random
>>> import string    
>>> random.choice(string.ascii_lowercase)
'b'

13

Un altro modo, per completezza:

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

Usa il fatto che ascii'a' è 97 e ci sono 26 lettere nell'alfabeto.

Quando si determina il limite superiore e inferiore della random.randrange()chiamata della funzione, ricordare che random.randrange()è esclusivo sul limite superiore, il che significa che genererà sempre e soltanto un numero intero fino a 1 unità in meno del valore fornito.


3
Dipende dall'alfabeto di cui stiamo parlando ;-)
Joey,

non dovrebbe essere chr(random.randrange(97, 97 + 26 - 1))?
zhongxiao37

1
@ zhongxiao37 Davvero, dovrebbe essere chr(random.randrange(97, 97 + 26). random.randrange()è esclusivo sul limite superiore, nel senso che per ottenere l'intera gamma di caratteri 97 - 122, l'argomento passato deve essere 123.
Kieran Moynihan,

@KieranMoynihan Grazie per la condivisione. L'ho ricontrollato e hai ragione. Ora vedo perché 97 + 26viene utilizzato.
zhongxiao37

6

Puoi usarlo per ottenere una o più lettere casuali

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 qual è la distribuzione di random.choices?
Jimmy,

@SalmanLashkarara help(random.choices)afferma If the relative weights or cumulative weights are not specified, the selections are made with equal probability.Questo significherebbe che la distribuzione è la distribuzione uniforme discreta ( en.wikipedia.org/wiki/Discrete_uniform_distribution ).
Riassunto il

5

Puoi semplicemente fare un elenco:

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

Puoi usare

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

Puoi ottenere stringhe casuali come questa:

g9CtUljUWD9wtk1z07iF
ndPbI1DDn6UvHSQoDMtd
klMFY3pTYNVWsNJ6cs34
Qgr7OEalfhXllcFDGh2l

1. Con Python3, sarebbe string.ascii_letters2. Puoi salvare la comprensione della lista usando keylist = random.choices(base_str(), k=KEY_LEN)3. Perché avere base_strcome funzione e non come base_str = string.ascii_letters+string.digits?
Riassunto il

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

Tutte le risposte precedenti sono corrette, se stai cercando caratteri casuali di vari tipi (cioè caratteri alfanumerici e speciali), ecco uno script che ho creato per dimostrare vari tipi di creazione di funzioni casuali, ha tre funzioni una per i numeri, alfa- personaggi e caratteri speciali. Lo script genera semplicemente password ed è solo un esempio per dimostrare vari modi di generare caratteri casuali.

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

Risultato:

inserisci qui la descrizione dell'immagine


-1

bene, questa è la mia risposta! Funziona bene. Inserisci il numero di lettere casuali che vuoi in 'numero' ... (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

Il mio pezzo di codice eccessivamente complicato:

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

In pratica genera un numero casuale su 26 e quindi si converte nella lettera corrispondente. Questo potrebbe essere migliorato con sfida, ma io sono solo un principiante e sono orgoglioso di questo codice.


4
la tua risposta ha bisogno di miglioramenti e non è molto funzionale.
Grepit,

1
nel tuo caso puoi semplicemente farlo print(chr(96 + letter)), no if- l' elifinferno è necessario
Azat Ibrakov,

-3

Forse questo può aiutarti:

import random
for a in range(64,90):
    h = random.randint(64, a)
    e += chr(h)
print e

Perché stai iterando tra 64 e 90? Perché non passare da 0 a 26 e compensare a? Questa risposta è piuttosto scarsa, l'output quasi casuale:@AAADCCEHFGJLDJF@EHFMHKWUR
Matt M.

-6

Posiziona un pitone sulla tastiera e lascialo scorrere sulle lettere fino a trovare la tua combinazione casuale preferita Sto solo scherzando!

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
Benvenuto in Stack Overflow! Sebbene questa sia una buona risposta, è identica alla risposta già pubblicata e accettata da @MarkRushakoff, con risposta due anni fa. Si prega di rivedere le risposte prima di pubblicare in modo da poter mantenere basso il rapporto segnale-rumore.
Agganciato il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.