1
votes

Existe-t-il un moyen de mélanger une liste en python?

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.

  1. J'ai essayé d'utiliser d'autres réponses que les gens ont posées sur ce problème sur StackOverflow et aucune n'a fonctionné ...
  2. J'ai essayé de mettre à jour pip et j'ai essayé de mettre à jour aléatoire (que vous ne pouvez apparemment pas utiliser pip car la bibliothèque Random pré-téléchargée avec python) essayé le code problématique dans python Shell et toujours le même problème ...
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)


2 commentaires

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)


3 Réponses :


1
votes

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:

  1. divise la chaîne en une liste de caractères.

  2. mélanger cette liste

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


1 commentaires

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



1
votes

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


2 commentaires

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.



1
votes

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


1 commentaires

Cette réponse n'aborde toujours pas le sujet de la chaîne non mélangée @AmitKeren!