No Python, como crio uma sequência de n caracteres em uma linha de código?

148

Eu preciso gerar uma string com n caracteres em Python. Existe uma resposta de uma linha para conseguir isso com a biblioteca Python existente? Por exemplo, preciso de uma sequência de 10 letras:

string_val = 'abcdefghij'
Thierry Lam
fonte
23
Deixe "em uma linha de código" para codificar concursos de ofuscação. Quando a solução para um problema for escrita naturalmente como uma linha, será; caso contrário, não deveria ser. Usá-lo como um objetivo próprio é um caminho garantido para códigos desagradáveis.
Glenn Maynard
3
A menos, claro, que isso seja lição de casa. Nesse caso, deixe o campo "em uma linha de código", mas seja honesto e inclua a tag [dever de casa].
S.Lott
5
Na verdade, não é uma pergunta de lição de casa, eu só precisava de uma seqüência de n comprimento nos meus scripts de teste. Eu esqueci que em Python, um caractere pode ser multiplicado por n onde n é um número inteiro positivo para alcançar o que eu quero.
Thierry Lam
consulte este stackoverflow.com/a/3391106/3779480
DigviJay Patil

Respostas:

310

Para simplesmente repetir a mesma letra 10 vezes:

string_val = "x" * 10  # gives you "xxxxxxxxxx"

E se você quiser algo mais complexo, como nletras minúsculas aleatórias, ainda será apenas uma linha de código (sem contar as instruções de importação e a definição n):

from random import choice
from string import ascii_lowercase
n = 10

string_val = "".join(choice(ascii_lowercase) for i in range(n))
Eli Courtwright
fonte
9

As dez primeiras letras minúsculas são string.lowercase[:10](se você importou o módulo da biblioteca padrão stringanteriormente, é claro ;-).

Outras maneiras de "criar uma sequência de 10 caracteres": 'x'*10(todos os dez caracteres serão minúsculos xs ;-), ''.join(chr(ord('a')+i) for i in xrange(10))(as dez primeiras letras minúsculas novamente), etc, etc ;-).

Alex Martelli
fonte
6
No Python 3.1.1, é string.ascii_lowercase, na verdade.
Lasse V. Karlsen
1
Sim, o python 3 foi removido .lowercase( ascii_lowercaseestá nos Python 2 recentes, bem como no Python 3).
Alex Martelli
5

se você quiser apenas letras:

 'a'*10  # gives 'aaaaaaaaaa'

se você quiser letras consecutivas (até 26):

 ''.join(['%c' % x for x in range(97, 97+10)])  # gives 'abcdefghij'
Peter
fonte
3

Por que "uma linha"? Você pode ajustar qualquer coisa em uma linha.

Supondo que você queira que eles comecem com 'a' e aumente em um caractere por vez (com quebra automática> 26), aqui está uma linha:

>>> mkstring = lambda(x): "".join(map(chr, (ord('a')+(y%26) for y in range(x))))
>>> mkstring(10)
'abcdefghij'
>>> mkstring(30)
'abcdefghijklmnopqrstuvwxyzabcd'
John Millikin
fonte
2
Você pode encaixar qualquer coisa em uma linha, não é? Quite a reivindicação, re: Python :)
Gregg Lind
6
Gregg: Python permite ponto-e-vírgula como delimitadores de instrução, para que você possa colocar um programa inteiro em uma linha, se desejar.
John Millikin
2
Você não pode executar um controle de fluxo arbitrário com ponto e vírgula. Loops aninhados, por exemplo.
recursivo
3

Isso pode ser um pouco fora de questão, mas para aqueles interessados ​​na aleatoriedade da sequência gerada, minha resposta seria:

import os
import string

def _pwd_gen(size=16):
    chars = string.letters
    chars_len = len(chars)
    return str().join(chars[int(ord(c) / 256. * chars_len)] for c in os.urandom(size))

Veja estas respostas e random.pya fonte para obter mais informações.

foudfou
fonte
2

Se você pode usar letras repetidas, pode usar o *operador:

>>> 'a'*5

'aaaaa'
Fragsworth
fonte