文字を2回含まないという基準で文字列をフィルタリングする必要があります。
- 文字列は多数あります(たとえば、1.4 兆)。
- 文字列は短い(約 8 文字)。
- 文字列は一意です(キャッシュは機能しません)。
- 文字列には大きな文字セットがあります (Unicode 文字など)。
- 通常、文字列は基準を満たしています(たとえば、2/3 には繰り返し文字がありません)。
使用コードは次のようになります。
>>> candidate_strings = ["foobnehg", "barfnehg", "bazfnehg"]
>>> result_strings = [s if unique_chars(s) for s in candidate_strings]
>>> print(result_strings)
["barfnehg", "bazfnehg"]
文字列を単純に繰り返す単純なバージョンを実装しました。
def unique_chars_naive(string_given):
"""
Checks if a given string contains only unique characters.
This version iterates the given string, saving all occurred characters.
"""
chars_seen = []
for char in string_given:
if char in chars_seen:
return False
chars_seen.append(char)
return True
私の次善の策は を使用することだったset
ので、それを実装しました:
def unique_chars_set(string_given):
"""
Checks if a given string contains only unique characters.
This version exploits that a set contains only unique entries.
"""
return len(string_given) == len(set(string_given))
関数をファイルに保存しUniqueCharacters.py
、時間を計った:
$ python3 -m timeit -n 100000 --setup='import UniqueCharacters; candidate_strings = ["foobnehg", "barfnehg", "bazfnehg"]' '[UniqueCharacters.unique_chars_naive(s) for s in candidate_strings]'
100000 loops, best of 3: 20.3 usec per loop
$ python3 -m timeit -n 100000 --setup='import UniqueCharacters; candidate_strings = ["foobnehg", "barfnehg", "bazfnehg"]' '[UniqueCharacters.unique_chars_set(s) for s in candidate_strings]'
100000 loops, best of 3: 17.7 usec per loop
これは、unique_chars_set
このデータセットの が約 15 % 高速であることを示しています。
これを行うより速い方法はありますか?多分正規表現で?これを行う標準ライブラリのメソッドはありますか?