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'

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

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

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


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'

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'

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.


2

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

>>> 'a'*5

'aaaaa'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.