1. ホーム
  2. パイソン

[解決済み】大文字と数字を含むランダムな文字列の生成

2022-03-18 10:34:27

質問

サイズNの文字列を生成したい。

などの数字と大文字の英字で構成されている必要があります。

  • 6U1S75
  • 4Z4UKK
  • U911K4

で実現するにはどうしたらいいでしょうか? パイソン の方法を教えてください。

どのように解決するのですか?

一行で答えてください。

''.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はメモリ上にリストを作成せず、その場で一つずつ要素を生成します(詳しくは、この ここで ).

文字列を 'n' 回作成するように要求する代わりに elem では、Pythonに一連の文字から選んだランダムな文字を'n'回作成するよう依頼します。

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