python: хранить char только в том случае, если он находится в этом списке - PullRequest
1 голос
/ 28 августа 2010

у меня есть список:

a = ['a','b','c'.........'A','B','C'.........'Z']

и у меня есть строка:

string1= 's#$%ERGdfhliisgdfjkskjdfW$JWLI3590823r'

я хочу сохранить ТОЛЬКО те символы в string1, которые существуют в a

Какой самый эффективный способ сделать это? возможно, вместо того, чтобы a был списком, я должен просто сделать его строкой? как это a='abcdefg..........ABC..Z' ??

Ответы [ 5 ]

7 голосов
/ 28 августа 2010

Это должно быть быстрее.

>>> import re
>>> string1 = 's#$%ERGdfhliisgdfjkskjdfW$JWLI3590823r'
>>> a = ['E', 'i', 'W']
>>> r = re.compile('[^%s]+' % ''.join(a))
>>> print r.sub('', string1)
EiiWW

Это даже быстрее, чем это.

>>> all_else = ''.join( chr(i) for i in range(256) if chr(i) not in set(a) )
>>> string1.translate(None, all_else)
'EiiWW'

44 мкс против 13 мкс на моем ноутбуке.

Как насчет этого?

(Редактировать: получилось, перевод дает лучшую производительность.)

5 голосов
/ 28 августа 2010
''.join([s for s in string1 if s in a])

Объяснение :

[s for s in string1 if s in a]

создает список всех символов в строке1, но только в том случае, если они также есть в списке a.

''.join([...])

превращает его обратно в строку, соединяя его без элементов ('') между элементами данного списка.

3 голосов
/ 28 августа 2010

Понимание списка на помощь!

wanted = ''.join(letter for letter in string1 if letter in a)

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

1 голос
/ 28 августа 2010

Если вы собираетесь делать это с большими строками, есть более быстрое решение с использованием translate;см. этот ответ .

0 голосов
/ 28 августа 2010

@ katrielalex: По буквам:

import string 
string1= 's#$%ERGdfhliisgdfjkskjdfW$JWLI3590823r'

non_letters= ''.join(chr(i) for i in range(256) if chr(i) not in string.letters)
print string1.translate(None,non_letters)

print 'Simpler, but possibly less correct'
print string1.translate(None, string.punctuation+string.digits+string.whitespace)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...