为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕丝7291255 2021-11-09 20:15:45
我有一个字符串和二进制序列(它是 0 和 1 的整数)sent1 = 'ERAGSJKDLLDERRR'bin_seq = 100101010100011所以我想通过与bin_seq. 所以如果bin_seq对应位置的值为1,它会返回字母。所以它应该返回:'EGJDLRR'我itertools.compress用于上述操作。from itertools import compresssent1 = 'ERAGSJKDLLDERRR'bin_seq = 100101010100011print("".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 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

你的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


查看完整回答
反对 回复 2021-11-09
?
温温酱

TA贡献1752条经验 获得超4个赞

您可以使用 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   


查看完整回答
反对 回复 2021-11-09
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

from itertools import compress


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


'EGJDLRR'

问题是您需要将compress(0, 1) 列表作为整数提供。


查看完整回答
反对 回复 2021-11-09
  • 3 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信