Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用itertools.compress根据二进制序列筛选字符串_Python_Python 3.x_Itertools - Fatal编程技术网

Python 使用itertools.compress根据二进制序列筛选字符串

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

我有一个字符串和二进制序列(整数是0和1)

因此,我想通过与
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
不是一个好选择。如果你想做数学运算,你应该只使用数字类型,例如,不用于电话号码、邮政编码或其他恰好是所有数字的字符串。