2017-02-10 20 views
2

У меня есть слово: HAPPY Я хочу разбить слово HAPPY следующим образом {"HA", "AP", "PP", "PY"} с помощью python.Как разбить слово в списке из двух символов

Я пробовал функцию:

itertools.combinations("HAPPY", 2) 

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

Я бы оценил любые предложения. Заранее спасибо!

ответ

5

Вы можете использовать регулярное выражение:

import re 

s = 'HAPPY' 
print(re.findall(r'(?=(..))', s)) 
// => ['HA', 'AP', 'PP', 'PY'] 

См Python demo

(?=(..)) модели находит место следует с любыми 2, кроме символов разрыва строки символов и фиксирует эти 2 символов. Затем двигатель regex переходит к следующему местоположению и захватывает еще два символа и так далее.

Что касается производительности, если компилировать регулярное выражение разница в производительности не так уж велик, но понимание должно быть немного быстрее:

import re 
import time 

s = 'HAPPY' 
rx = re.compile(r'(?=(..))', re.DOTALL) 

def test_regex(): 
    return rx.findall(s) 

def test_comprehension(): 
    return [(s)[i:i+2] for i in range(0,len(s)-1)] 

n = 10000 
t0 = time.time() 
for i in range(n): test_regex() 
t1 = time.time() 
print('regex: {}'.format(t1-t0)) 

t0 = time.time() 
for i in range(n): test_comprehension() 
t1 = time.time() 
print('comprehension: {}'.format(t1-t0)) 
# => regex: 0.00773191452026 
# => comprehension: 0.00626182556152 

См online test

+0

ОП предполагают, что они хотят 'set' выход (хотя я на самом деле не верю им) –

+0

Для чего это стоит, если я наткнулся это в исходном коде, я бы не знал, что он делает. Ответы по составлению списка - это ИМО, гораздо более понятные. –

+0

Спасибо за быстрый ответ. Я четко согласен с тем, что понимание списков более понятно. Но мой вопрос будет, какой из них является лучшим решением проблемы производительности? – Proma

3

Быстрый и грязный список понимание

[("HAPPY")[i:i+2] for i in range(0,len("HAPPY")-1)] 
0

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

string = "HAPPY" 
[string[idx:idx+2] for idx in range(len(string))] 
1

Вы могли бы сделать что-то вроде этого:

word = 'HAPPY' 
combos = [word[i:i+2] for i in range(len(word) - 1)]