2015-05-01 2 views
2

Теперь у меня есть это:Объединить два .join методы в один

str = " s tr & &^ 23G7/*%45afju657**(%^#%$!!fdf" 

str = ''.join(e for e in str if e.isalnum()) 
str = ''.join(('...', str, '...')) 

Могу ли я комбинировать их люблю:

str = ''.join(('...', e for e in str if e.isalnum(), '...')) 
+2

Вы попробовали запустить его? –

+1

Нет, потому что 'e for e ...' не является строкой, которой требуется «join». Вы можете сделать что-то вроде: 'str = '' .join (('...', '' .join (e для e в str, если e.isalnum()), '...'))' – malfunctioning

+0

@SterlingArcher , http://ideone.com/QWJWmA – niceday

ответ

4

Вы можете использовать format там

s = "...{}...".format(''.join(e for e in s if e.isalnum())) 

Как примечание стороны, не называйте вашу строку как str, как это тени встроенную

Кроме того, если вы действительно хотите использовать join дважды, вы можете написать его как

''.join(('...', ''.join(e for e in s if e.isalnum()), '...')) 

Но это не очень хорошая идея. Зачем использовать ядерную бомбу, чтобы убить комара!

+0

oh lol Я, хотя '...' был другими частями его 'my_str' ... не литерным' ... '+1 –

+0

@JoranBeasley Было ясно' '... '';;) –

+0

да 20- 20 задним числом и повторным чтением вопроса, который я вижу: P –

3

вы могли бы сделать

my_str = ''.join(['...']+ [e for e in my_str if e.isalnum()] +['...']) 
+0

Отлично! Спасибо). – niceday

2
string = " s tr & &^ 23G7/*%45afju657**(%^#%$!!fdf" 

Вы можете использовать filter(), как синтаксический сахар для понимания. Однако он лучше всего работает для функций, а не методов - lambda, который маскирует строковый метод как функцию, делает это медленным по сравнению с простым пониманием (спасибо, @Bhargav).

string = ''.join(['...', ''.join(filter(lambda x: x.isalnum(), string)), '...']) 

или:

string = ''.join(filter(lambda x: x.isalnum(), string)).join(['...']*2) 

в зависимости от того, что заказ вы предпочитаете.

+1

Интересно отметить, что использование «лямбда» здесь делает операцию ужасно медленной по сравнению с не-лямбда-решениями, которые почти с одинаковой скоростью. –

+1

@ TigerhawkT3 маленький опечатка, требуется x.isalnum() –

+0

Lambda медлительность отмечен, исправлена ​​ошибка. Спасибо, что указали на них. – TigerhawkT3

3

Почему вы не используете только оператора +? И filter тоже неплохо. Поскольку вы используете Python 2.7, вам даже не нужно повторно присоединяться:

>>> s = " s tr & &^ 23G7/*%45afju657**(%^#%$!!fdf" 
>>> s = '...' + filter(str.isalnum, s) + '...' 
>>> s 
'...str23G745afju657fdf...' 
+0

Мне нравится использование 'str.' здесь. Для более длинных строк в 2.7 было бы быстрее использовать 'join()' вместо конкатенации? – TigerhawkT3

+0

@ TigerhawkT3 Вместо какой конкатенации? О, вы имеете в виду '+'? Я так не думаю, но я попробую. –

+0

Нет, не имеет значения. Почему? –

Смежные вопросы