繁体   English   中英

迭代时从列表中删除和连接元素

[英]Remove and concat elements from a list while iterating

我正在使用 python 并且我有以下列表:

mylist = ['Module(stmt* body, type_ignore *type_ignores)', '| Interactive(stmt* body)', 'FunctionDef(identifier name, arguments args,','stmt* body, expr* decorator_list, expr? returns,','string? type_comment)']

如果第二个元素不以)结尾并且前一个元素不以|开头,我想将列表的一个元素与前一个元素连接起来 ,然后删除第二个元素。 例如, mylist应转换为:

mylist = ['Module(stmt* body, type_ignore *type_ignores)', '| Interactive(stmt* body)', 'FunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)']

我编写了以下递归代码:

def test(line1, line2):
    if line1[-1] != ')' and line2[0] != '|':
       return True, line1 + line2
else:
    return False, line1


def concat_rule(lines):
    for index in range(len(lines)):
        if index + 1 >= len(lines):
            return lines
        value = test(lines[index], lines[index + 1])
        if value[0]:
            lines[index] = value[1]
            del lines[index + 1]
            break
    if value[0]:
        return concat_rule(lines)

它有效,但我想知道它是否存在一个包含完整列表的最简单解决方案。

无需递归 - 您可以使用简单的循环。 (我不确定列表理解在这里是否有帮助。)

这是一个进行就地修改的版本:

index = 1
while index < len(mylist):
    if mylist[index - 1][-1] != ')' and mylist[index][0] != '|':
        mylist[index - 1] += mylist.pop(index)
    else:
        index += 1

这是一个创建新列表的版本:

output = [mylist[0]]
for item in mylist[1:]:
    if output[-1][-1] != ')' and item[0] != '|':
        output[-1] += item
    else:
        output.append(item)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM