Jak w Pythonie utworzyć ciąg n znaków w jednej linii kodu?

148

Muszę wygenerować ciąg z n znakami w Pythonie. Czy istnieje jedna linia odpowiedzi, aby to osiągnąć przy użyciu istniejącej biblioteki Python? Na przykład potrzebuję ciągu 10 liter:

string_val = 'abcdefghij'
Thierry Lam
źródło
23
Pozostaw „w jednej linii kodu”, aby kodować konkursy zaciemniania kodu. Kiedy rozwiązanie problemu jest naturalnie zapisane w jednej linii, będzie to; w przeciwnym razie nie powinno. Używanie go jako własnego celu jest gwarantowaną ścieżką do nieprzyjemnego kodu.
Glenn Maynard,
3
Chyba że jest to praca domowa. W takim przypadku pozostaw „w jednym wierszu kodu”, ale bądź szczery i dołącz tag [praca domowa].
S.Lott,
5
Właściwie to nie jest zadanie domowe, potrzebowałem tylko ciągu n długości w moich skryptach testowych. Zapomniałem, że w Pythonie znak można pomnożyć przez n, gdzie n jest dodatnią liczbą całkowitą, aby osiągnąć to, czego chcę.
Thierry Lam,
skieruj

Odpowiedzi:

310

Aby po prostu powtórzyć tę samą literę 10 razy:

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

A jeśli chcesz czegoś bardziej złożonego, na przykład nlosowych małych liter, to nadal jest to tylko jeden wiersz kodu (nie licząc instrukcji importu i definiowania 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
źródło
9

Pierwsze dziesięć małych liter to string.lowercase[:10]( stringoczywiście jeśli wcześniej zaimportowałeś moduł biblioteki standardowej ;-).

Inne sposoby „utworzenia ciągu 10 znaków”: 'x'*10(wszystkie dziesięć znaków będzie małymi literami xs ;-), ''.join(chr(ord('a')+i) for i in xrange(10))(ponownie pierwsze dziesięć małych liter), itd. ;-).

Alex Martelli
źródło
6
W Pythonie 3.1.1 jest to właściwie string.ascii_lowercase.
Lasse V. Karlsen
1
Tak, Python 3 został usunięty .lowercase( ascii_lowercasejest w ostatnich Python 2, a także w Pythonie 3).
Alex Martelli,
5

jeśli chcesz tylko litery:

 'a'*10  # gives 'aaaaaaaaaa'

jeśli chcesz otrzymywać kolejne litery (do 26):

 ''.join(['%c' % x for x in range(97, 97+10)])  # gives 'abcdefghij'
Piotr
źródło
3

Dlaczego „jedna linia”? Możesz zmieścić wszystko w jednej linii.

Zakładając, że chcesz, aby zaczynały się od „a” i za każdym razem zwiększały o jeden znak (z zawijaniem> 26), oto linia:

>>> mkstring = lambda(x): "".join(map(chr, (ord('a')+(y%26) for y in range(x))))
>>> mkstring(10)
'abcdefghij'
>>> mkstring(30)
'abcdefghijklmnopqrstuvwxyzabcd'
John Millikin
źródło
2
Możesz zmieścić wszystko w jednej linii, co? Całkiem roszczenie, re: Python :)
Gregg Lind
6
Gregg: Python dopuszcza średniki jako separatory instrukcji, więc jeśli chcesz, możesz umieścić cały program w jednej linii.
John Millikin
2
Nie możesz jednak dowolnie sterować przepływem za pomocą średników. Na przykład zagnieżdżone pętle.
rekurencyjne
3

To może być trochę niezgodne z pytaniem, ale dla osób zainteresowanych losowością generowanego ciągu moja odpowiedź brzmiałaby:

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

Zobacz te odpowiedzi i random.pyźródło, aby uzyskać więcej informacji.

foudfou
źródło
2

Jeśli możesz użyć powtarzających się liter, możesz użyć *operatora:

>>> 'a'*5

'aaaaa'
Fragsworth
źródło