Как Вы фильтруете строку, таким образом, что только символы в Вашем списке возвращаются?

Попробуйте удалить аннотацию @Repository над интерфейсом TestRepository.

«Аннотация Spring @Repository используется для указания того, что класс предоставляет механизм для хранения, ...» см .: https://www.journaldev.com/21460 / spring-repository-annotation

blockquote>

Предложение. Измените интерфейс TestRepository, чтобы расширить JpaRepository. У него больше функциональности.

22
задан Aurora0001 19 March 2017 в 19:30
поделиться

8 ответов

>>> s = 'Agh#$%#%2341- -!zdrkfd'
>>> ''.join(i for i in s if  i in 'qwertyuiopasdfghjklzxcvbnm')
'ghzdrkfd'
4
ответ дан 29 November 2019 в 03:41
поделиться

Если вам нужна эффективность. Использование функции 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
32
ответ дан 29 November 2019 в 03:41
поделиться

Использовать регулярное выражение достаточно просто, особенно для этого сценария:

>>> 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'
5
ответ дан 29 November 2019 в 03:41
поделиться

Я бы использовал регулярное выражение. Для строчного соответствия [az].

0
ответ дан 29 November 2019 в 03:41
поделиться

Вот одно решение, если вы особенно заинтересованы в работе со строками:

 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)
1
ответ дан 29 November 2019 в 03:41
поделиться
import string
print "".join([c for c in "Agh#$%#%2341- -!zdrkfd" if c in string.lowercase])
0
ответ дан 29 November 2019 в 03:41
поделиться
s = 'Agh#$%#%2341- -!zdrkfd'  
print ''.join(c for c in s if c.islower())

Строковые объекты итерируемы; нет необходимости «разбивать» строку на список. Вы можете поместить любое условие в понимание списка, и оно будет соответственно фильтровать символы.

Вы также можете реализовать это, используя регулярное выражение, но это только скроет цикл. Библиотеке регулярных выражений все равно придется перебирать символы строки, чтобы отфильтровать их.

18
ответ дан 29 November 2019 в 03:41
поделиться
s = 'ASDjifjASFJ7364'
s_lowercase = ''.join(filter(lambda c: c.islower(), s))
print s_lowercase #print 'jifj'
4
ответ дан 29 November 2019 в 03:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: