亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 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條經驗 獲得超13個贊

from itertools import compress


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


'EGJDLRR'

問題是您需要將compress(0, 1) 列表作為整數提供。


查看完整回答
反對 回復 2021-11-09
  • 3 回答
  • 0 關注
  • 209 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號