次のような数字と大文字の英語の文字で構成されたサイズ N の文字列を生成するにはどうすればよいですか。
- 6U1S75
- 4Z4UKK
- U911K4
ベストアンサー1
一行で答えてください:
''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N))
Python 3.6以降ではさらに短くなりますrandom.choices()
:
''.join(random.choices(string.ascii_uppercase + string.digits, k=N))
暗号化により安全なバージョン: この投稿を見る
''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(N))
詳細には、さらに再利用するためのクリーンな関数が含まれています。
>>> import string
>>> import random
>>> def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
... return ''.join(random.choice(chars) for _ in range(size))
...
>>> id_generator()
'G5G74W'
>>> id_generator(3, "6793YUIO")
'Y3U'
どのように機能しますか?
string
一般的な ASCII 文字のシーケンスを含むモジュール と、random
ランダム生成を扱うモジュール をインポートします。
string.ascii_uppercase + string.digits
大文字の ASCII 文字と数字を表す文字のリストを連結するだけです。
>>> string.ascii_uppercase
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.digits
'0123456789'
>>> string.ascii_uppercase + string.digits
'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
次に、リストの内包表記を使用して 'n' 個の要素のリストを作成します。
>>> range(4) # range create a list of 'n' numbers
[0, 1, 2, 3]
>>> ['elem' for _ in range(4)] # we use range to create 4 times 'elem'
['elem', 'elem', 'elem', 'elem']
上記の例では、[
リストを作成するために を使用していますが、関数では を使用しませんid_generator
。そのため、Pythonはメモリ内にリストを作成せず、要素を1つずつオンザフライで生成します(これについての詳細はここ)。
文字列を n 回作成するように要求する代わりにelem
、文字列からランダムに選んだ文字を n 回作成するように Python に要求します。
>>> random.choice("abcde")
'a'
>>> random.choice("abcde")
'd'
>>> random.choice("abcde")
'b'
したがって、文字random.choice(chars) for _ in range(size)
のシーケンスを作成しますsize
。ランダムに選択された文字chars
:
>>> [random.choice('abcde') for _ in range(3)]
['a', 'b', 'b']
>>> [random.choice('abcde') for _ in range(3)]
['e', 'b', 'e']
>>> [random.choice('abcde') for _ in range(3)]
['d', 'a', 'c']
次に、それらを空の文字列で結合して、シーケンスが文字列になるようにします。
>>> ''.join(['a', 'b', 'b'])
'abb'
>>> [random.choice('abcde') for _ in range(3)]
['d', 'c', 'b']
>>> ''.join(random.choice('abcde') for _ in range(3))
'dac'