Générer une lettre aléatoire en Python

147

Existe-t-il un moyen de générer des lettres aléatoires en Python (comme random.randint mais pour les lettres)? La fonctionnalité de plage de random.randint serait bien, mais avoir un générateur qui ne produit qu'une lettre aléatoire serait mieux que rien.

Kudu
la source

Réponses:

247

Facile:

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

string.ascii_letters renvoie une chaîne contenant les lettres minuscules et majuscules en fonction des paramètres régionaux actuels.

random.choice renvoie un élément aléatoire unique d'une séquence.

Mark Rushakoff
la source
12
Il s'agit en fait de string.ascii_lowercase ou string.ascii_uppercase.
Taylor Leese
9
Souvent, j'ai besoin d'une chaîne de randoms, voici que (après from string import ascii_letters, digitset from random import choice):''.join([choice(ascii_letters + digits) for i in range(32)])
Devin
7
@joaquin string.letters est présent dans python 2.7.7.
Wilson Canda
70
>>> import random
>>> import string
>>> random.choice(string.ascii_letters)
'g'
Joaquin
la source
Cela peut être en minuscule ou en majuscule. Je ne sais pas si c'est ce dont on a besoin.
Taylor Leese
3
@TaylorLeese, comme je l' ai connu qu'il ya trois options , y compris ascii_letters, ascii_uppercaseet 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

pour générer y nombre de caractères aléatoires

Saad
la source
7
aussi:''.join(random.sample(string.ascii_lowercase,5))
Dannid
@Dannid Ne renvoie pas random.sample()un ensemble unique de valeurs à partir de l'entrée, ce qui n'est pas le même que random.choice()?
Droppy
Oui, mais si vous choisissez une seule lettre qui ne fait pas de différence. De plus, vous voudrez peut-être 5 lettres uniques - l'OP n'a pas spécifié, et les deux random.choiceet random.randintretournent une seule valeur. Vous pouvez également utiliser numpy.random.choicepour donner un ensemble unique si vous ajoutez replace = False, comme ceci:numpy.random.choice(string.ascii_lowercase, size=5, replace=False)
Dannid
21
>>> import random
>>> import string    
>>> random.choice(string.ascii_lowercase)
'b'
Taylor Leese
la source
13

Une autre façon, par souci d'exhaustivité:

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

Utilisez le fait que ascii «a» vaut 97 et qu'il y a 26 lettres dans l'alphabet.

Lors de la détermination de la limite supérieure et inférieure de l' random.randrange()appel de fonction, rappelez-vous qu'elle random.randrange()est exclusive sur sa limite supérieure, ce qui signifie qu'elle ne générera jamais qu'un entier jusqu'à 1 unité de moins que la valeur fournie.

rlotun
la source
3
Cela dépend de l'alphabet dont nous parlons ;-)
Joey
ça ne devrait pas être chr(random.randrange(97, 97 + 26 - 1))?
zhongxiao37
1
@ zhongxiao37 Vraiment, ça devrait l'être chr(random.randrange(97, 97 + 26). random.randrange()est exclusif sur sa borne supérieure, ce qui signifie que pour obtenir toute la plage de caractères 97 - 122, l'argument passé doit être 123.
Kieran Moynihan le
@KieranMoynihan Merci pour le partage. J'ai vérifié et vous avez raison. Maintenant, je vois pourquoi 97 + 26est utilisé.
zhongxiao37
6

Vous pouvez l'utiliser pour obtenir une ou plusieurs lettre (s) aléatoire (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']
salhin
la source
@NigelRen quelle est la distribution de random.choices?
Jimmy
@SalmanLashkarara help(random.choices)déclare If the relative weights or cumulative weights are not specified, the selections are made with equal probability.Cela signifierait que la distribution est la distribution uniforme discrète ( en.wikipedia.org/wiki/Discrete_uniform_distribution ).
Qaswed
5

Vous pouvez simplement faire une liste:

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

Vous pouvez utiliser

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

Vous pouvez obtenir des chaînes aléatoires comme ceci:

g9CtUljUWD9wtk1z07iF
ndPbI1DDn6UvHSQoDMtd
klMFY3pTYNVWsNJ6cs34
Qgr7OEalfhXllcFDGh2l
王孝先
la source
1. Avec Python3, ce serait string.ascii_letters2. Vous pouvez sauvegarder la compréhension de la liste en utilisant keylist = random.choices(base_str(), k=KEY_LEN)3. Pourquoi avoir base_strcomme fonction et pas a 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
user9739613
la source
0

Toutes les réponses précédentes sont correctes, si vous recherchez des caractères aléatoires de différents types (c'est-à-dire des caractères alphanumériques et spéciaux), alors voici un script que j'ai créé pour démontrer différents types de création de fonctions aléatoires, il a trois fonctions une pour les nombres, alpha- caractères et caractères spéciaux. Le script génère simplement des mots de passe et n'est qu'un exemple pour illustrer différentes manières de générer des caractères aléatoires.

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

Résultat:

entrez la description de l'image ici

grepit
la source
-1

eh bien, c'est ma réponse! Ça marche bien. Mettez simplement le nombre de lettres aléatoires que vous voulez dans 'nombre' ... (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
la source
-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
la source
-1

Mon morceau de code trop compliqué:

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

Il génère essentiellement un nombre aléatoire sur 26, puis se convertit en sa lettre correspondante. Cela pourrait être amélioré, mais je ne suis qu'un débutant et je suis fier de ce morceau de code.

Nit Nurray
la source
4
votre réponse doit être améliorée et n'est pas très fonctionnelle.
grepit le
1
dans votre cas, vous pouvez simplement le faire print(chr(96 + letter)), non if- l' elifenfer est nécessaire
Azat Ibrakov
-3

Peut-être que cela peut vous aider:

import random
for a in range(64,90):
    h = random.randint(64, a)
    e += chr(h)
print e
peter
la source
Pourquoi itérez-vous entre 64 et 90? Pourquoi ne pas simplement passer de 0 à 26 et décaler un? Cette réponse est assez pauvre, la sortie à peine aléatoire:@AAADCCEHFGJLDJF@EHFMHKWUR
Matt M.
-6

Placez un python sur le clavier et laissez-le rouler sur les lettres jusqu'à ce que vous trouviez votre combo aléatoire préféré Je plaisante!

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
la source
2
Bienvenue dans Stack Overflow! Bien que ce soit une bonne réponse, elle est identique à la réponse déjà publiée et acceptée par @MarkRushakoff, répondu il y a deux ans. Veuillez examiner les réponses avant de publier afin que nous puissions réduire le rapport signal / bruit.
Accroché