Як в Python я можу створити рядок з n символів в одному рядку коду?


148

Мені потрібно генерувати рядок із п символами в Python. Чи є відповідь в одному рядку, щоб досягти цього за допомогою існуючої бібліотеки Python? Наприклад, мені потрібна рядок з 10 літер:

string_val = 'abcdefghij'

23
Залиште "в одному рядку коду", щоб кодувати конкурси на обфускування. Коли рішення проблеми природним чином записується як один рядок, воно буде; інакше не повинно бути. Використання його як власної мети - це гарантований шлях до неприємного коду.
Гленн Мейнард

3
Якщо, звичайно, це домашнє завдання. У такому випадку залиште "в одному рядку коду", але будьте чесними та додайте тег [домашнє завдання].
S.Lott

5
Це насправді не питання домашнього завдання, мені просто потрібна була рядка довжиною n у моїх тестових сценаріях. Я забув, що в Python знак може бути помножений на n, де n - це додатне ціле число, щоб досягти того, що я хочу.
Тьєррі Лам

Відповіді:


310

Щоб просто повторити той самий лист 10 разів:

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

І якщо ви хочете щось складніше, як-от nвипадкові малі літери, це все одно лише один рядок коду (без урахування імпортних виписок та визначення n):

from random import choice
from string import ascii_lowercase
n = 10

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

9

Перші десять малих літер є string.lowercase[:10](якщо ви вже імпортували стандартний модуль бібліотеки string, звичайно ;-).

Інші способи "зробити рядок з 10 символів": 'x'*10(всі десять символів будуть малі xs ;-), ''.join(chr(ord('a')+i) for i in xrange(10))(перші десять малих літер знову) тощо, тощо; тощо ;-).


6
У Python 3.1.1 насправді це string.ascii_lowercase.
Лассе В. Карлсен

1
Так, python 3 видалено .lowercase( ascii_lowercaseє останнім часом, як і в Python 3).
Алекс Мартеллі

5

якщо ви просто хочете будь-які листи:

 'a'*10  # gives 'aaaaaaaaaa'

якщо ви хочете послідовні листи (до 26):

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

3

Чому "одна лінія"? Ви можете помістити що-небудь на одну лінію.

Припустимо, що ви хочете, щоб вони починалися з 'a' та збільшувались по одному символу кожен раз (із загортанням> 26), ось рядок:

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

2
Ви можете вкласти що-небудь в однорядковий, так? Досить претензія, re: Python :)
Грегг Лінд

6
Грегг: Python дозволяє крапки з комою як роздільники висловлювань, тому ви можете розмістити всю програму на одному рядку.
Джон Міллікін

2
Однак ви не можете робити довільний контроль потоку крапками з комою. Наприклад, вкладені петлі.
рекурсивна

3

Це може бути трохи поза питанням, але для тих, хто цікавиться випадковістю згенерованого рядка, моя відповідь буде:

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

Дивіться ці відповіді та random.pyджерело для отримання більш детальної інформації.


2

Якщо ви можете використовувати повторні букви, ви можете скористатися *оператором:

>>> 'a'*5

'aaaaa'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.