使用 itertools.compress 基于二进制序列过滤字符串

我有一个字符串和二进制序列(它是 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。


慕丝7291255
浏览 185回答 3
3回答

FFIVE

你的compress方法很接近。它不起作用,因为字符串“0”和“1”在布尔上下文中都计算为 True。一种快速的解决方案是将它们转换为整数,因为在布尔上下文中 0 是 False 而 1 是 True:import itertoolssent1 = 'ERAGSJKDLLDERRR'bin_seq = 100101010100011print("".join(itertools.compress(sent1, map(int, str(bin_seq)))))结果:EGJDLRR

温温酱

您可以使用 LC 而不是 for 循环''.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   

红颜莎娜

from itertools import compress''.join(compress(sent1, map(int, str(bin_seq))))'EGJDLRR'问题是您需要将compress(0, 1) 列表作为整数提供。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python