J'essaye de faire un chiffrement simple en utilisant un abc aléatoire pour le convertir Mais j'ai un problème avec la bibliothèque Random.
import random def random(st = 'i love cats') abc = 'abcdefghijklmnopqrstuvwxyz' randomabc = abc random.shuffle(randomabc) print(randomabc)
la sortie attendue est un ordre aléatoire de l'ABC la sortie réelle est une erreur (le code s'arrête avant l'impression à cause de l'erreur)
3 Réponses :
Puisque abc
est une chaîne, qui est immuable (vous ne pouvez pas la changer sur place), vous ne pouvez pas le faire comme ça.
Au lieu de cela, vous devez:
divise la chaîne en une liste de caractères.
mélanger cette liste
Rejoindre la liste de caractères dans une chaîne
erbkvownuhcmfljtgqpyiazdxs
Exemple de sortie:
import random abc = 'abcdefghijklmnopqrstuvwxyz' ls = list(abc) random.shuffle(ls) abc = ''.join(ls) print(abc)
Aussi : ne nommez jamais vos fonctions ou vos fichiers .py avec des noms en conflit avec la bibliothèque standard. Dans ce cas, votre fonction porte le même nom que le module random
, et c'est un énorme problème.
abc.split ()
renverra probablement une liste à 1 élément qui n'est pas ce qui est recherché ... aussi, random.shuffle
est une opération en place et renvoie Aucun
, donc le code est effectivement '' .join (None)
ce qui ne fonctionnera pas ...
Vous ne pouvez pas mélanger une chaîne
, c'est un objet immuable qui ne peut pas être modifié une fois attribué.
Au lieu de cela, vous devez le convertir en liste (un objet mutable), mélangez la liste via random.shuffle qui mélange la liste sur place, puis reconvertit la liste en chaîne.
print(''.join(random.sample(abc, len(abc))))
La sortie sera
dpfozwhyxalebnqrmstcjvuigk qgjefyrahobpnxtzmsdkwivlcu nchkriewsuxdzyjfgvpblomtqa .....
En plus de cela, une autre alternative (une ligne unique) consiste à utiliser random.sample pour choisir des échantillons uniques de len (abc)
et les joindre tous dans une chaîne (Merci @JonClements) mais c'est plus adapté pour un remaniement unique
import random abc = 'abcdefghijklmnopqrstuvwxyz' #Convert string to list li = list(abc) #Shuffle the list inplace random.shuffle(li) #Convert list to string print(''.join(li))
Merci @JonClements J'ai mis à jour ma réponse pour noter cela et vous a référé en tant que créateur :)
Je ne dirais pas que c'est un bon one-liner ... c'est juste une alternative qui n'est pas terrible si vous le faites simplement comme un mélange unique ... si vous allez à plusieurs reprises mélanger et donner des résultats ou similaires, il est préférable de l'avoir sous forme de liste, puis de réorganiser la liste.
Comme je l'ai mentionné dans les commentaires, vous devez donner à vos fonctions des noms différents des mots-clés python, des modules importés, des noms de classe, etc. Essayez de renommer votre méthode de la forme random
en random_alphabet code >.
import random
def random_alphabet(st = 'i love cats'):
pass
Cette réponse n'aborde toujours pas le sujet de la chaîne non mélangée @AmitKeren!
Si vous donnez à votre méthode le même nom que le module importé, il suivra le module.
randomabc = liste (abc); random.shuffle (randomabc); return "" .join (randomabc)