Мне нужно отфильтровать строки по критерию, чтобы они не содержали символ дважды.Каков самый быстрый способ проверить, содержит ли строка повторяющиеся символы в Python 3?
- Струны многие (скажем 1400000000000).
- Строки короткие (около 8 символов).
- Строки уникальные (кеширование не работает).
- Строки имеют большой набор символов (скажем любой символ Юникода).
- Строки обычно соответствуют критерию (скажем, 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% для этого набора данных.
Есть ли более быстрый способ сделать это? Возможно, с регулярными выражениями? Есть ли какой-нибудь метод в стандартной библиотеке, который это делает?
Возможно ли повторение строк в 'кандидат_строках'? – Jared
Тест с более длинными словами. –
У всех строк есть только строчные алфавитные символы? Если нет, они содержат только символы ASCII? – Kevin