按二进制列表格式化字符串

时间:2013-03-02 01:35:04

标签: python

使用相同长度的字符串和二进制列表,例如:

[0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0]
 s  t  a  c  k  o  v  e  r  f  l  o  w

是否有可能获得一个新的字符串-t-c-over----

[0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0]
 -  t  -  c  -  o  v  e  r  -  -  -  -

也就是说,与0匹配的每个字符都将替换为-。所需的输出将是一个列表,如下所示,字母匹配1,连字符匹配0分别分组:

['-', 't', '-', 'c', '-', 'over', '----']

谢谢!

4 个答案:

答案 0 :(得分:4)

这样的事情怎么样? 压缩两个列表并迭代并构建输出。保留最后一个二进制值以确定是否应该追加或连接。

blist = [0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0]
string = 'stackoverflow'
output = []    
previous = not blist[0] # to cause the first char to be appended

for b,s in zip(blist, string):
    char = '-' if b == 0 else s

    if previous == b:
        output[-1] += char         
    else:
        output.append(char)

    previous = b

print(output)

另一种选择是正则表达式:

import re

blist = [0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0]
string = 'stackoverflow'

x = ''.join(['-' if b == 0 else s for b,s in zip(blist, string)])
output = re.findall('(-+|[a-z]+)', x)

print(output)

答案 1 :(得分:3)

你可以享受迭代器的乐趣(不需要拉链!:)

it = iter([0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0])
s = 'stackoverflow'

output = [''.join(('-' for i in b) if not a else b)
          for a,b in 
          itertools.groupby(s, key=lambda x: next(it))]

因此输出将是:

['-', 't', '-', 'c', '-', 'over', '----']

答案 2 :(得分:1)

answer last Question可能会略微修改以获得所需的结果

第一回答:

鉴于

[''.join(v) for k, v in groupby(st, key = lambda e:next(it_lst))]

修饰

[''.join(v if k else ('-' for _ in v)) 
 for k, v in groupby(st, key = lambda e:next(it_lst))]

第二个答案

鉴于

[''.join(zip(*v)[-1]) 
 for k, v in groupby(zip(lst, st), key = itemgetter(0)) if k]

修饰

[''.join(zip(*v)[-1] if k else ('-' for _ in v)) 
 for k, v in groupby(zip(lst, st), key = itemgetter(0))]

注意 你需要做的就是

  1. 停止忽略0条目
  2. 对于每个0条目,创建一个长度等于0
  3. 下的分组字符串的字符串

答案 3 :(得分:1)

你可以这样做:

string = "stackoverflow"
arr = [0,1,1,0,1,0,1,0,1,0,0,1,0]
new = ""
for i in range(len(arr)):
    new += string[i]*arr[i] +"-"*(abs(arr[i]-1))

这利用了字符串乘以0是空字符串。

然后您可以使用正则表达式将其拆分为字符串列表

import re
list = re.findall("-+|[A-z]+", new)

"-+|[A-z]+"匹配的模式是长度大于1的短划线字符串或长度大于1的字母串。