En Python, comment créer une chaîne de n caractères dans une ligne de code?

148

J'ai besoin de générer une chaîne avec n caractères en Python. Existe-t-il une réponse en une ligne pour y parvenir avec la bibliothèque Python existante? Par exemple, j'ai besoin d'une chaîne de 10 lettres:

string_val = 'abcdefghij'
Thierry Lam
la source
23
Laissez "dans une ligne de code" pour coder les concours d'obfuscation. Lorsque la solution d'un problème est naturellement écrite sur une seule ligne, elle le sera; sinon ça ne devrait pas être. L'utiliser comme un objectif en soi est un chemin garanti vers du code malveillant.
Glenn Maynard le
3
Sauf, bien sûr, ce sont des devoirs. Dans ce cas, laissez le "dans une ligne de code" mais soyez honnête et incluez la balise [devoirs].
S.Lott
5
Ce n'est en fait pas une question de devoir, j'avais juste besoin d'une chaîne de longueur n dans mes scripts de test. J'ai oublié qu'en Python, un caractère peut être multiplié par n où n est un entier positif pour obtenir ce que je veux.
Thierry Lam
référez-vous à stackoverflow.com/a/3391106/3779480
DigviJay Patil

Réponses:

310

Pour répéter simplement la même lettre 10 fois:

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

Et si vous voulez quelque chose de plus complexe, comme ndes lettres minuscules aléatoires, ce n'est toujours qu'une seule ligne de code (sans compter les instructions d'importation et sans définir 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
la source
9

Les dix premières lettres minuscules sont string.lowercase[:10](si vous avez stringprécédemment importé le module de bibliothèque standard , bien sûr ;-).

Autres façons de "créer une chaîne de 10 caractères": 'x'*10(tous les dix caractères seront des xs minuscules ;-), ''.join(chr(ord('a')+i) for i in xrange(10))(les dix premières lettres minuscules à nouveau), etc, etc ;-).

Alex Martelli
la source
6
Dans Python 3.1.1, il s'agit en fait de string.ascii_lowercase.
Lasse V. Karlsen
1
Oui, python 3 supprimé .lowercase( ascii_lowercaseest dans Python 2 récent ainsi que dans Python 3).
Alex Martelli le
5

si vous voulez juste des lettres:

 'a'*10  # gives 'aaaaaaaaaa'

si vous voulez des lettres consécutives (jusqu'à 26):

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

Pourquoi "une ligne"? Vous pouvez insérer n'importe quoi sur une seule ligne.

En supposant que vous vouliez qu'ils commencent par `` a '' et incrémentent d'un caractère à chaque fois (avec retour à la ligne> 26), voici une ligne:

>>> mkstring = lambda(x): "".join(map(chr, (ord('a')+(y%26) for y in range(x))))
>>> mkstring(10)
'abcdefghij'
>>> mkstring(30)
'abcdefghijklmnopqrstuvwxyzabcd'
John Millikin
la source
2
Vous pouvez mettre n'importe quoi sur une seule ligne, hein? Tout à fait une réclamation, re: Python :)
Gregg Lind
6
Gregg: Python autorise les points-virgules comme délimiteurs d'instructions, vous pouvez donc mettre un programme entier sur une seule ligne si vous le souhaitez.
John Millikin le
2
Cependant, vous ne pouvez pas faire de contrôle de flux arbitraire avec des points-virgules. Des boucles imbriquées par exemple.
récursif le
3

Cela peut être un peu hors de la question, mais pour ceux qui s'intéressent au caractère aléatoire de la chaîne générée, ma réponse serait:

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

Voir ces réponses et random.pyla source pour plus d'informations.

foudfou
la source
2

Si vous pouvez utiliser des lettres répétées, vous pouvez utiliser l' *opérateur:

>>> 'a'*5

'aaaaa'
Fragsworth
la source