此处的任务是将字符串110011110110000
分解为一个列表:
['11', '00', '1111', '0', '11', '0000']
我的解决方法是
str1='110011110110000'
seg = []
a0=str1[0]
seg0=''
for a in str1:
print('a=',a)
if a==a0:
seg0=seg0+a
else:
print('seg0=',seg0)
seg.append(seg0)
seg0=a
a0=a
seg.append(seg0)
seg
这很丑陋,我相信你们那里对此有一线希望。也许正则表达式?
答案 0 :(得分:3)
您可以使用itertools.groupby
(doc):
str1='110011110110000'
from itertools import groupby
l = [v * len([*g]) for v, g in groupby(str1)]
print(l)
打印:
['11', '00', '1111', '0', '11', '0000']
编辑:带有正则表达式的版本:
str1='110011110110000'
import re
print([g[0] for g in re.findall(r'((\d)\2*)', str1)])
答案 1 :(得分:3)
以下是使用简单模式1+|0+
的迭代正则表达式方法:
str1 = "110011110110000"
pattern = re.compile(r'(1+|0+)')
result = []
for m in re.finditer(pattern, str1):
result.append(m.group(0))
print(result)
此打印:
['11', '00', '1111', '0', '11', '0000']
请注意,我们可能想在这里使用re.split
。 re.split
的问题在于它似乎不支持环视拆分。在其他语言(例如Java)中,我们可以尝试按此模式进行拆分:
(?<=0)(?=1)|(?<=1)(?=0)
这会很好地生成我们期望的数组/列表。
答案 2 :(得分:3)
这是一个正则表达式解决方案:
result = [x[0] for x in re.findall(r'(([10])\2*)', str1)]
正则表达式为(([10])\2*)
,找到0或1,然后继续寻找相同的东西。由于findall
返回了匹配项中的所有组,因此我们需要将其映射到第一个组(组2为([10])
位)。
答案 3 :(得分:1)
使用groupy
from itertools import groupby
text='1100111101100001'
sol = [''.join(group) for key, group in groupby(text)]
print(sol)
输出
['11', '00', '1111', '0', '11', '0000', '1']
不是正则表达式解决方案,而是对您的代码进行了改进
str1='110011110110000'
def func(string):
tmp = string[0]
res =[]
for i, v in enumerate(string, 1):
if v==tmp[-1]:
tmp+=v
else:
res.append(tmp)
tmp=v
res.append(tmp)
return res
print(func(str1))
输出
['111', '00', '1111', '0', '11', '0000']
答案 4 :(得分:1)