Python: преобразование строки в флаги - PullRequest
2 голосов
/ 18 мая 2010

Если у меня есть строка, которая является выходом совпадения с регулярным выражением [MSP]*, каков самый чистый способ преобразовать его в dict, содержащий ключи M, S и P, где значение каждого ключа истинно, если ключ появляется в строке?

, например

 'MSP' => {'M': True, 'S': True, 'P': True}
 'PMMM'   => {'M': True, 'S': False, 'P': True}
 ''    => {'M': False, 'S': False, 'P': False}
 'MOO'    won't occur... 
          if it was the input to matching the regexp, 'M' would be the output

Лучшее, что я могу придумать, это:

 result = {'M': False, 'S': False, 'P': False}
 if (matchstring):
     for c in matchstring:
         result[c] = True

но это кажется немного неуклюжим, я задавался вопросом, был ли лучший способ.

Ответы [ 2 ]

6 голосов
/ 18 мая 2010

Почему бы не использовать frozenset (или set, если требуется изменчивость)?

s = frozenset('PMMM')
# now s == frozenset({'P', 'M'})

тогда вы можете использовать

'P' in s

чтобы проверить, существует ли флаг P.

3 голосов
/ 18 мая 2010

В более новых версиях Python вы можете использовать расширенное понимание:

s = 'MMSMSS'
d = { c: c in s for c in 'MSP' }

В старых версиях вы можете использовать это, как указывает KennyTM:

d = dict((c, c in s) for c in 'MSP')

Это даст хорошую производительность для длинных строк, потому что, если все три символа появляются в начале строки, поиск может быть остановлен раньше. Это не потребует поиска по всей строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...