使用相同长度的字符串和二进制列表,例如:
[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', '----']
谢谢!
答案 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))]
注意强> 你需要做的就是
0
条目0
条目,创建一个长度等于0
答案 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的字母串。