Отфильтруйте строку на основе двоичной последовательности, используя itertools.compress - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть строка и двоичная последовательность (которая является целым числом 0 и 1)

sent1 = 'ERAGSJKDLLDERRR'
bin_seq = 100101010100011

Поэтому я хочу получить буквы, сравнивая с bin_seq.Таким образом, он вернет букву, если значение bin_seq равно 1 в соответствующих позициях.

Таким образом, оно должно вернуть:

'EGJDLRR'

Я использую itertools.compress для вышеуказанной операции.

from itertools import compress

sent1 = 'ERAGSJKDLLDERRR'
bin_seq = 100101010100011

print("".join(list(itertools.compress(sent1, str(bin_seq)))))

, который возвращает результат:

'ERAGSJKDLLDERRR'

Я знаю, что могу сделать это легко, используя цикл for:

sent_new = []
for i,j in zip(sent1, str(bin_seq)):
    if j == '1':
        sent_new.append(i)
print("".join(sent_new))

НоЯ больше беспокоюсь о том, почему он не дает ожидаемый результат с itertools.compress.

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019
from itertools import compress

''.join(compress(sent1, map(int, str(bin_seq))))

'EGJDLRR'

Проблема в том, что вам нужно указать compress список (0, 1) в виде целых чисел.

0 голосов
/ 15 февраля 2019

Вы можете использовать LC вместо цикла

''.join([c for c, b in zip(sent1, str(bin_seq)) if b=='1'])

Редактировать:
Ради интереса я рассчитал два доступных на данный момент решения:

''.join(compress(sent1, map(int, str(bin_seq))))
1.360 s                                                    
''.join([c for c, b in zip(sent1, str(bin_seq)) if b=='1']) 
0.766 s                            
0 голосов
/ 15 февраля 2019

Ваш compress подход близок.Это не работает, потому что строки «0» и «1» оба имеют значение True в логическом контексте.Одним из быстрых решений является преобразование их в целые, поскольку 0 равно False, а 1 - True в логическом контексте:

import itertools

sent1 = 'ERAGSJKDLLDERRR'
bin_seq = 100101010100011

print("".join(itertools.compress(sent1, map(int, str(bin_seq)))))

Результат:

EGJDLRR
...