Попробуйте удалить аннотацию @Repository над интерфейсом TestRepository.
«Аннотация Spring @Repository используется для указания того, что класс предоставляет механизм для хранения, ...» см .: https://www.journaldev.com/21460 / spring-repository-annotation
blockquote>Предложение. Измените интерфейс TestRepository, чтобы расширить JpaRepository. У него больше функциональности.
>>> s = 'Agh#$%#%2341- -!zdrkfd'
>>> ''.join(i for i in s if i in 'qwertyuiopasdfghjklzxcvbnm')
'ghzdrkfd'
Если вам нужна эффективность. Использование функции translate - самое быстрое из возможных.
Ее можно использовать для быстрой замены символов и / или их удаления.
import string
delete_table = string.maketrans(
string.ascii_lowercase, ' ' * len(string.ascii_lowercase)
)
table = string.maketrans('', '')
"Agh#$%#%2341- -!zdrkfd".translate(table, delete_table)
В python 2.6: вам не нужен вторая таблица больше
import string
delete_table = string.maketrans(
string.ascii_lowercase, ' ' * len(string.ascii_lowercase)
)
"Agh#$%#%2341- -!zdrkfd".translate(None, delete_table)
Этот метод намного быстрее, чем любой другой. Конечно, вам нужно где-то сохранить delete_table и использовать ее. Но даже если вы не сохраняете его и не строите каждый раз, он все равно будет быстрее, чем другие предлагаемые методы.
Чтобы подтвердить мои утверждения, вот результаты:
for i in xrange(10000):
''.join(c for c in s if c.islower())
real 0m0.189s
user 0m0.176s
sys 0m0.012s
При запуске решения с регулярным выражением :
for i in xrange(10000):
re.sub(r'[^a-z]', '', s)
real 0m0.172s
user 0m0.164s
sys 0m0.004s
[По запросу] Если вы предварительно скомпилируете регулярное выражение:
r = re.compile(r'[^a-z]')
for i in xrange(10000):
r.sub('', s)
real 0m0.166s
user 0m0.144s
sys 0m0.008s
Выполнение метода перевода заняло такое же количество раз:
real 0m0.075s
user 0m0.064s
sys 0m0.012s
Использовать регулярное выражение достаточно просто, особенно для этого сценария:
>>> import re
>>> s = 'ASDjifjASFJ7364'
>>> re.sub(r'[^a-z]+', '', s)
'jifj'
Если вы планируете делать это много раз, лучше заранее скомпилировать регулярное выражение:
>>> import re
>>> s = 'ASDjifjASFJ7364'
>>> r = re.compile(r'[^a-z]+')
>>> r.sub('', s)
'jifj'
Я бы использовал регулярное выражение. Для строчного соответствия [az].
Вот одно решение, если вы особенно заинтересованы в работе со строками:
s = 'Agh#$%#%2341- -!zdrkfd'
lowercase_chars = [chr(i) for i in xrange(ord('a'), ord('z') + 1)]
whitelist = set(lowercase_chars)
filtered_list = [c for c in s if c in whitelist]
Белый список на самом деле является набором (а не списком) для эффективности.
Если вам нужна строка, используйте join ():
filtered_str = ''.join(filtered_list)
filter () - более общее решение. Из документации ( http://docs.python.org/library/functions.html ):
filter (function, iterable)
Создайте список из тех элементов итерабельности, для которых функция возвращает истину. iterable может быть либо последовательностью, контейнером, поддерживающим итерацию, либо итератором. Если итерация является строкой или кортежем, результат также имеет этот тип; в противном случае это всегда список. Если function равно None, предполагается функция идентичности, то есть все элементы итерации, которые являются ложными, удаляются.
Это может быть один из способов использования filter ():
filtered_list = filter(lambda c: c.islower(), s)
import string
print "".join([c for c in "Agh#$%#%2341- -!zdrkfd" if c in string.lowercase])
s = 'Agh#$%#%2341- -!zdrkfd'
print ''.join(c for c in s if c.islower())
Строковые объекты итерируемы; нет необходимости «разбивать» строку на список. Вы можете поместить любое условие в понимание списка, и оно будет соответственно фильтровать символы.
Вы также можете реализовать это, используя регулярное выражение, но это только скроет цикл. Библиотеке регулярных выражений все равно придется перебирать символы строки, чтобы отфильтровать их.
s = 'ASDjifjASFJ7364'
s_lowercase = ''.join(filter(lambda c: c.islower(), s))
print s_lowercase #print 'jifj'