Python 如何保持严格的项目交替模式;“类型”;在列表中?
给定一个字符串列表,其中每个字符串的格式为“a-something”或“B-somethingelse”,并且列表项主要在“a”数据段和“B”数据段之间交替,如何消除不规则性Python 如何保持严格的项目交替模式;“类型”;在列表中?,python,list,Python,List,给定一个字符串列表,其中每个字符串的格式为“a-something”或“B-somethingelse”,并且列表项主要在“a”数据段和“B”数据段之间交替,如何消除不规则性 不规则性是指破坏A B模式的任何序列 如果存在多个A,则还应删除下一个B 如果有多个B,则前面的A也应删除 删除这些无效的序号后,应保持列表顺序 示例:A B A BA BA B A B A BA B BA B A BA A B BA B A B 在这种情况下,应删除AAB(见规则2)、ABB(见规则3)和AABB 我会把
在这种情况下,应删除AAB(见规则2)、ABB(见规则3)和AABB 我会把它写成发电机。重复:
- 尽可能多读A
- 尽可能多读B
- 如果你已经准确地读到了1A和1B,就把它们放出来;否则忽略并继续
此外,这还需要一个额外的特殊情况,以防您希望允许输入以
A
结尾,我将尝试使用regexp返回要删除的序列索引
>>> import re
>>> data = 'ABABAABABABABABBABABAABBABAB'
>>> [(m.start(0), m.end(0)) for m in re.finditer('(AA+B+)|(ABB+)', data)]
[(4, 7), (13, 16), (20, 24)]
或剥离的结果
>>> re.sub('(AA+B+)|(ABB+)', '', data)
ABABABABABABABABAB
使用
itertools.groupby
:
from itertools import groupby
def solve(strs):
drop_next = False
ans = []
for k, g in groupby(strs):
lis = list(g)
if drop_next:
#if True then don't append the current set to `ans`
drop_next = False
elif len(lis) > 1 and k == 'A':
#if current group contains more than 1 'A' then skip the next set of 'B'
drop_next = True
elif len(lis) > 1 and k == 'B':
#if current group contains more than 1 'B' then pop the last appended item
if ans:
ans.pop(-1)
else:
ans.append(k)
return ''.join(ans)
strs = 'ABABAABABABABABBABABAABBABAB'
print solve(strs)
#ABABABABABABABABAB
itertools解决方案中的醉汉:
>>> s = 'ABABAABABABABABBABABAABBABAB'
>>> from itertools import groupby, takewhile, islice, repeat, chain
>>> groups = (list(g) for k,g in groupby(s))
>>> pairs = takewhile(bool, (list(islice(groups, 2)) for _ in repeat(None)))
>>> kept_pairs = (p for p in pairs if len(p[0]) == len(p[1]) == 1)
>>> final = list(chain(*chain(*kept_pairs)))
>>> final
['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B']
(不幸的是,我现在无法考虑角案例和尾随
A
s等)你的意思是说“如果有多个A,下一组B也应该被删除。”在你的例子中,你有[A B]被删除。这是正确的,尽管在维护替换的一般规则中暗示了这一点。如果只有一个B被删除,我们将留下:。。。(有效前)A B(无效)B(有效后)A B。。。