Python 使用itertools.compress根据二进制序列筛选字符串
我有一个字符串和二进制序列(整数是0和1) 因此,我想通过与Python 使用itertools.compress根据二进制序列筛选字符串,python,python-3.x,itertools,Python,Python 3.x,Itertools,我有一个字符串和二进制序列(整数是0和1) 因此,我想通过与bin_seq进行比较来获取字母。因此,如果相应位置的bin_seq值为1,它将返回字母 因此,它应该返回: 'EGJDLRR' 我正在使用itertools.compress进行上述操作 from itertools import compress sent1 = 'ERAGSJKDLLDERRR' bin_seq = 100101010100011 print("".join(list(itertools.compress(s
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
提供预期的输出,因为您的压缩方法非常接近。它不起作用,因为字符串“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
您的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
问题是您需要将(0,1)的列表作为int馈送压缩
问题是您需要将(0,1)的列表作为int馈送压缩。您可以使用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
您可以使用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
你也可以压缩(双关语)你的zip方法在一行中:“”。如果b='1',加入(c代表c,b在zip中(sent1,str(bin_seq))
@tobias_k我正在练习itertools
,所以我更关心itertool.compress
solution.BTW,IMHO对bin_seq
使用int
不是一个好选择。如果你想做数学运算,你应该只使用数字类型,例如,不用于电话号码、邮政编码或其他恰好是全数字的字符串。你也可以压缩(双关语)你的zip
方法在一行中:“”。如果b='1',则加入(c代表c,b在zip中(sent1,str(bin_seq)))
@tobias_k我正在使用itertools
练习,所以我更关心itertool.compress
解决方案。顺便说一句,对于bin\u seq
使用int
不是一个好选择。如果你想做数学运算,你应该只使用数字类型,例如,不用于电话号码、邮政编码或其他恰好是所有数字的字符串。