(追記: 2023-01-15)この記事書いた人(過去の私)なんでUUID使わないんだろうと思った。なんか制約があったのだろうか。それとも知らなかっただけ?
重複しない英数字(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()で除外リストを得る。
問題点
文字列を使い切ると、永遠に探し続ける。対策するなら文字数に応じてリストのサイズを計算してそれより十分小さいことを確認する、とかかしら……。まぁでも使い切るようなケースなら最初からセットを作るほうが良い気がする。
参考記事
参考にさせていただきました。ありがとうございました。
コメント