Pythonでユニークでランダムな文字列のリストを作成する

重複しない英数字(0-9a-zA-Z)の文字列のリストを作成したい。既に使われている文字列も読み込めるとする。文字列の長さも指定できるとする。pythonで実行する。pythonは3.6。

スポンサーリンク

コード

ランダムな文字列を生成したら、それを用意した除外リストと照らし合わせて、重複していたら再度メソッドを実行するような感じで、以下のように書いた。

import random
import string
class MakeRndCode:
    def __init__(self, rndlist=[]):
        self._rndlist = list(set(rndlist))

    def mkrnd(self, strlen=8):
        src_str = string.ascii_letters + string.digits
        rnd_str = "".join([random.choice(src_str) for x in range(strlen)])
        # unique?
        if rnd_str in self._rndlist:
            rnd_str = self.mkrnd(strlen)
        self._rndlist.append(rnd_str)
        return rnd_str

    def addlist(self, rndlist):
        rndlist = list(set(rndlist))
        self._rndlist += rndlist

    def tolist(self):
        print(self._rndlist)

if __name__ == '__main__':
    mkrndcd = MakeRndCode()
    rnd = mkrndcd.mkrnd(10)
    print(rnd)

    rndl = [mkrndcd.mkrnd(10) for x in range(5)]
    print(rndl)

実行する。

> python test.py 
nNKMM8MpX9
['UnwAsPyHaF', '3rLJyEgcIi', 'Yufgnyjrda', 'rkGvfC9iQz', 'CAaUoHthTM']

mkrndcd = MakeRndCode([除外したい文字列のリスト])でインスタンスを作る。リストを加えたくなったらmkrndcd.addlist([除外したい文字列のリスト])。文字列を作るときはmkrndcd.mkrnd(文字数)。作った文字列は除外リストに追加される。mkrndcd.tolist()で除外リストを得る。

問題点

文字列を使い切ると、永遠に探し続ける。対策するなら文字数に応じてリストのサイズを計算してそれより十分小さいことを確認する、とかかしら……。まぁでも使い切るようなケースなら最初からセットを作るほうが良い気がする。

参考記事

参考にさせていただきました。ありがとうございました。

関連コンテンツ

関連記事

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。