Pythonでは、1行のコードでn文字の文字列を作成するにはどうすればよいですか?


148

Pythonでn文字の文字列を生成する必要があります。既存のPythonライブラリでこれを達成するための1行の回答はありますか?たとえば、10文字の文字列が必要です。

string_val = 'abcdefghij'

23
難読化コンテストをコーディングするには、「1行のコード」のままにします。問題の解決策が自然に1行で記述されている場合、それは次のようになります。そうでなければそれはすべきではありません。独自の目標としてそれを使用することは、厄介なコードへの保証されたパスです。
グレンメイナード

3
もちろん、これは宿題ではありません。その場合は、「1行のコード」のままにしますが、正直に言って[宿題]タグを含めます。
S.Lott 09/09/15

5
実際には宿題ではありません。テストスクリプトに長さnの文字列が必要でした。Pythonでは、charにnを掛けることができることを忘れてしまいました。
ティエリーラム

回答:


310

同じ文字を単純に10回繰り返すには:

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

そして、nランダムな小文字のようなもっと複雑なものが必要な場合でも、それはコードの1行だけです(importステートメントを数えずに定義しますn)。

from random import choice
from string import ascii_lowercase
n = 10

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

9

最初の10文字の小文字はstring.lowercase[:10]stringもちろん、以前に標準ライブラリモジュールをインポートしたことがあれば、;-)です。

「10文字の文字列を作成する」他の方法:'x'*10(10文字すべてが小文字xのs ''.join(chr(ord('a')+i) for i in xrange(10));-になります)、(最初の10文字が小文字になります)など;-)。


6
Python 3.1.1では、実際にはstring.ascii_lowercaseです。
ラッセV.カールセン

1
はい、Python 3は削除されました.lowercaseascii_lowercase最近のPython 2とPython 3にあります)。
Alex Martelli、

5

手紙が欲しいだけなら:

 'a'*10  # gives 'aaaaaaaaaa'

連続した文字が必要な場合(最大26文字):

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

3

なぜ「一行」なのか?1行に何でも入れることができます。

それらを「a」で開始し、毎回1文字ずつ(折り返し> 26)増やしたいとすると、次の行があります。

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

2
何でも1行に収めることができます。かなりの主張、再:Python :)
Gregg Lind

6
Gregg:Pythonではステートメントの区切り文字としてセミコロンを使用できるので、必要に応じてプログラム全体を1行に置くことができます。
ジョンミリキン

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のソースをご覧ください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.