2009-09-14 24 views
83

Necesito generar una cadena con n caracteres en Python. ¿Hay una respuesta de una línea para lograr esto con la biblioteca de Python existente? Por ejemplo, necesito una cadena de 10 letras:En Python, ¿cómo creo una cadena de n caracteres en una línea de código?

string_val = 'abcdefghij' 
+16

Deje "en una línea de código" para codificar los concursos de ofuscación. Cuando la solución a un problema se escribe naturalmente como una línea, será; de lo contrario, no debería ser. Usarlo como un objetivo propio es una ruta garantizada para el código desagradable. –

+3

A menos, por supuesto, esto es tarea. En ese caso, deje la "en una línea de código", pero sea honesto e incluya la etiqueta [tarea]. –

+5

En realidad no es una pregunta para la tarea, solo necesitaba una cadena de n longitud en mis scripts de prueba. Olvidé que en Python, un char se puede multiplicar por n donde n es un entero positivo para lograr lo que quiero. –

Respuesta

191

repetir simplemente la misma carta 10 veces:

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

Y si quieres algo más complejo, como n letras minúsculas al azar, sigue siendo una sola línea de código (sin contar las declaraciones de importación y definiendo n):

from random import choice 
from string import lowercase 
n = 10 

string_val = "".join(choice(lowercase) for i in range(n)) 
9

Las diez primeras letras minúsculas son string.lowercase[:10] (si ha importado el módulo de la biblioteca estándar string previamente, por supuesto ;-).

Otras formas de "hacer una cadena de 10 caracteres": 'x'*10 (todos los diez caracteres en minúsculas se x s ;-), ''.join(chr(ord('a')+i) for i in xrange(10)) (las primeras diez letras minúsculas de nuevo), etc, etc ;-).

+4

En Python 3.1.1, es string.ascii_lowercase en realidad. –

+0

Sí, python 3 eliminó '.lowercase' (' ascii_lowercase' está en Python 2's y en Python 3). –

2

Si puede utilizar letras repetidas, se puede utilizar el operador *:

>>> 'a'*5 

'aaaaa' 
3

¿Por qué "una línea"? Puedes colocar cualquier cosa en una línea.

Suponiendo que usted quiere que comienzan con 'A', y el incremento en un carácter cada vez (con el embalaje> 26), aquí es una línea:

>>> mkstring = lambda(x): "".join(map(chr, (ord('a')+(y%26) for y in range(x)))) 
>>> mkstring(10) 
'abcdefghij' 
>>> mkstring(30) 
'abcdefghijklmnopqrstuvwxyzabcd' 
+2

Puede ajustar cualquier cosa en una sola línea, ¿eh? Todo un reclamo, re: Python :) –

+6

Gregg: Python permite los puntos y comas como delimitadores de enunciados, por lo que puede poner todo un programa en una línea si lo desea. –

+2

No se puede hacer un control de flujo arbitrario con punto y comas.Bucles anidados por ejemplo. – recursive

3

si lo que desea cualquier letra:

'a'*10 # gives 'aaaaaaaaaa' 

si quieren letras consecutivas (hasta 26):

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

Esto podría ser un poco fuera de la cuestión, pero para aquellos interesados ​​en la aleatoriedad de la cadena generada, mi respuesta sería:

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

ver fuente theseanswers y random.py 's para una visión más clara.

Cuestiones relacionadas