使用二进制序列过滤字符串itertools.compress文件

2024-10-05 14:24:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串和二进制序列(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的预期输出。


Tags: 字符串newforbin字母二进制compressseq
3条回答
from itertools import compress

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

'EGJDLRR'

问题是您需要将(0,1)列表作为int提供给compress。你知道吗

你可以用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                            

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

相关问题 更多 >