2015-07-01 2 views
-2

Предположим, у нас есть предложение вроде: "ABCDEFG", а также список таких знаков: [0,0,1,0,0,0,1]. То, что я намереваюсь сделать, состоит в том, чтобы разделить исходную строку на сегменты, используя список меток: если символ имеет индекс i в исходной строке, и с помощью этого индекса мы могли бы получить 1 в списке меток, то этот символ является конец слова.Как разбить строку на список меток в python?

Таким образом, исходная строка может быть разделена на ['ABC', 'DEFG']

Как добиться этого в Python? Я имею в виду не простой способ, как использование временного буфера.

+0

его совсем не ясно, чего вы хотите достичь. –

+0

Этот вопрос более подходит для публикации в http://codegolf.stackexchange.com/ И что это значит «что-то еще»? :-) –

+0

Используйте метод 'groupby' в документации Python' itertools': https://docs.python.org/3/library/itertools.html#itertools.groupby – Sam

ответ

0

Мы можем использовать простой for цикл, чтобы добиться этого -

>>> s = "ABCDEFG" 
>>> l = [0,0,1,0,0,0,1] 
>>> 
>>> endlist = [] 
>>> tsh = '' 
>>> for i, ch in enumerate(s): 
...  tsh += ch 
...  if l[i] == 1: 
...    endlist.append(tsh) 
...    tsh = '' 
... 
>>> endlist 
['ABC', 'DEFG'] 
+1

Я здесь придирчивый, но вы должны добавить символы в массив, а затем «присоединиться» к концу. То, как вы делаете это сейчас, это O (n^2) - добавление символа в строку - O (n), где n - длина строки. – James

+0

@James, если есть только одна ссылка на строку, добавление в конец строки амортизируется O (1) –

+0

@JohnLaRooy, спасибо, что указали это! Я этого не знал. – James

0

Простой подход был бы:

temp = "ABCDEFG" 
t = [0,0,1,0,0,0,1] 
f_i, e_i = 0,0 
for index,val in enumerate(t): 
    if val: 
     e_i = index +1 
     print temp[f_i: e_i ]  #Here you can store these as you wish 
     f_i = e_i 
0

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

s = "ABCDEFG" 
L = [0,0,1,0,0,0,1] 

pos = 0 
res = [] 
while True: 
    try: 
     idx = L.index(1, pos) + 1 
    except ValueError: 
     break 
    res.append(s[pos: idx]) 
    pos = idx 

print(res) 
+0

Мне очень нравится ваша идея! Тем не менее, есть ли какая-либо ссылка на «индекс является самым быстрым, почему нужно найти 1s»? – VELVETDETH

0

Простой ответ:

l = [0,0,1,0,0,0,1] 
s = 'ABCDEFG' 
indices = [i for i, x in enumerate(l) if x == 1] 
t = 0 
a = [] 
for i in indices: 
    a.append(s[t:i+1]) 
    t = i+1 
print(a) 
0

Еще одна вариация на тему.

marks = [0,0,1,0,0,0,1] 
sentence = 'ABCDEFG' 

output = [] 
last_index = 0 

for index, mark in enumerate(marks): 
    if mark: 
     output.append(sentence[last_index:index+1]) 
     last_index = index+1 

print(output) 
Смежные вопросы