Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何保持严格的项目交替模式;“类型”;在列表中?_Python_List - Fatal编程技术网

Python 如何保持严格的项目交替模式;“类型”;在列表中?

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 我会把

给定一个字符串列表,其中每个字符串的格式为“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

    我会把它写成发电机。重复:

    • 尽可能多读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。。。