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'

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,

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

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


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'

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'

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.


2

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

>>> 'a'*5

'aaaaa'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.