Método incorporado para generar cadenas aleatorias de longitud fija a partir de caracteres dados

Este es mi problema: necesito hacer una cadena aleatoria de 50 caracteres, compuesta de 1 sy 0 s.

Sé cómo resolver este problema, e incluso tengo una sola línea para ello. También busqué varias soluciones para este problema en SO, solo para recuperar lo que ya sé ( 1 , 2 , etc.). Pero lo que realmente quiero es la forma más pythonica de hacer esto.

Actualmente, me ''.join(( random.choice([0,1]) for i in xrange(50) )) hacia ''.join(( random.choice([0,1]) for i in xrange(50) ))

¿Hay una forma más pythonica de hacer esto? ¿Hay una incorporada que haga algo como esto, tal vez en itertools ?

Para Python2.7 o mejor:

 In [83]: import random In [84]: '{:050b}'.format(random.randrange(1<<50)) Out[84]: '10011110110110000011111000011100101111101001001011' 

(En Python2.6, use '{0:050b}' lugar de '{:050b}' .)


Explicación :

El método string.format puede convertir enteros en sus representaciones de cadenas binarias. El código de formato básico para hacer esto es '{:b}' :

 In [91]: '{:b}'.format(10) Out[91]: '1010' 

Para hacer una cadena de ancho 50, use el código de formato '{:50b}' :

 In [92]: '{:50b}'.format(10) Out[92]: ' 1010' 

y para completar el espacio en blanco con ceros, use {:050b} :

 In [93]: '{:050b}'.format(10) Out[93]: '00000000000000000000000000000000000000000000001010' 

La syntax de str.format es un poco desalentadora al principio. Aquí está mi hoja de trucos:

 http://docs.python.org/library/string.html#format-string-syntax replacement_field ::= "{" field_name ["!" conversion] [":" format_spec] "}" field_name ::= (identifier|integer)("."attribute_name|"["element_index"]")* attribute_name ::= identifier element_index ::= integer conversion ::= "r" | "s" format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type] fill ::=  align ::= "<" | ">" | "=" | "^" "=" forces the padding to be placed after the sign (if any) but before the digits. (for numeric types) "<" left justification ">" right justification "^" center justification sign ::= "+" | "-" | " " "+" places a plus/minus sign for all numbers "-" places a sign only for negative numbers " " places a leading space for positive numbers # for integers with type b,o,x, tells format to prefix output with 0b, 0o, or 0x. 0 enables zero-padding. equivalent to 0= fill align. width ::= integer , tells format to use a comma for a thousands separator precision ::= integer type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "x" | "X" | "%" c convert integer to corresponding unicode character n uses a locale-aware separator % multiplies number by 100, display in 'f' format, with percent sign 
 # Choose a number in [0, 1L << 50), and format it as binary. # The [2:] lops off the prefix "0b" bit_str = bin(random.randint(0, (1L << 50) - 1))[2:] # We then need to pad to 50 bits. fifty_random_bits = '%s%s' % ('0' * (50 - len(bit_str)), bit_str) 

Eso me parece bastante pythonico. Puede perder los corchetes si desea guardar en caracteres:

 ''.join( random.choice(['0','1']) for i in xrange(50) ) 
 from random import choice from itertools import repeat # map or generator expression, take your pick "".join( map( choice, repeat( "01", 50))) "".join( choice(x) for x in repeat("01", 50)) 

Cambia las entradas para repeat para generalizar.