[最終更新] 2023年1月15日
(追記: 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()で除外リストを得る。
問題点
文字列を使い切ると、永遠に探し続ける。対策するなら文字数に応じてリストのサイズを計算してそれより十分小さいことを確認する、とかかしら……。まぁでも使い切るようなケースなら最初からセットを作るほうが良い気がする。
参考記事
参考にさせていただきました。ありがとうございました。
関連記事
Python の記事
- [2018年7月20日] pythonのpipで入れているもの
- [2018年6月25日] cronのpythonスクリプト内にあるjson.dump()でensure_ascii=Falseにして日本語出力しようとしてハマった
- [2018年6月22日] pythonでRSSフィードを取得し、画像がない場合、リンク先の記事から拾う
- [2018年5月21日] pythonのmysqlclientでSSH越しにAWSのRDSにアクセス
- [2018年5月17日] matplotlibでx軸の時刻情報をフォーマットする
- ---本記事---
- [2018年1月29日] Pandasでcsv, excelデータの読み込み・書き込み
- [2018年1月19日] pythonでcsvファイルの入出力。エンコードとか改行コードとか考慮しつつ
- [2018年1月16日] Pythonでファイル・ディレクトリ操作
- [2018年1月9日] pythonで画像をダウンロードして、URLに応じてディレクトリ分けする
- [2017年12月27日] Pandasで行の追加(縦方向の連結)の操作メモ
スポンサーリンク