Lisandro
(usa Arch Linux)
Enviado em 06/07/2016 - 10:41h
Oi achei tua lógica pouco pythonica, parece mais C.
Vai aí umas dicas para encolher e simplificar este teu código.
Como gerar strings com os conjuntos de caracteres que tu queres:
>>> import string
>>> string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
>>> string.ascii_lowercase
'abcdefghijklmnopqrstuvwxyz'
>>> string.ascii_uppercase
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.digits
'0123456789'
>>> string.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
Como sortear:
>>> import random
>>> random.choice(string.ascii_lowercase)
'u'
>>> random.choice(string.ascii_uppercase)
'S'
>>> random.choice(string.digits)
'6'
Para evitar repetições:
Bom ai existem várias opções e quanto maior a lista mais recursos serão consumidos.
Uma opção seria guardar no tipo "set" que não tolera repetições, mas também tem a característica de não ser ordenada.
Exemplo:
Cria um "set" com as minúsculas. Veja que fica desordenada:
>>> s = set(string.ascii_lowercase)
>>> s
{'h', 'y', 'r', 'q', 'j', 'i', 'z', 'g', 'b', 's', 'u', 'e', 'v', 'a', 'c', 'p', 'd', 'w', 'm', 'x', 'l', 'n', 't', 'k', 'o', 'f'}
Tenta adicionar a string "3" ao set e consegue, pois não existe outro elemento igual:
>>> s.add('3')
>>> s
{'h', 'y', 'r', 'q', 'j', 'i', 'z', 'g', 'b', 's', '3', 'u', 'e', 'v', 'a', 'c', 'p', 'd', 'w', 'm', 'x', 'l', 'n', 't', 'k', 'o', 'f'}
Tenta incluir as strings "w" e "3" no set, mas como os elementos já estão lá a ordem é ignorada:
>>> s.add('w')
>>> s.add('3')
>>> s
{'h', 'y', 'r', 'q', 'j', 'i', 'z', 'g', 'b', 's', '3', 'u', 'e', 'v', 'a', 'c', 'p', 'd', 'w', 'm', 'x', 'l', 'n', 't', 'k', 'o', 'f'}
É isso. Espero ter ajudado.
Abraço