在Python中用一个值替换列表中的序列

4
我希望将列表中连续的两个特定元素替换为另一个元素(组)。例如,将["+", "="]替换为["+="]
输入:
[3, "blah", "+", "foo", "=", "+", "="]

输出:

[3, "blah", "+", "foo", "=", "+="]

1
你能展示一下你目前尝试过的吗? - Adalee
我已经使用 zip 做了一个小包装器,但我想知道是否有更短、更优雅、更符合 Python 风格的方法(例如一些好的列表推导或其他方法)。 - R.O.S.S
@R.O.S.S,你能添加你的尝试吗? - Bhargav Rao
3个回答

2
以下方法虽然对于长列表非常低效,但是可以解决问题:
loop=[3, "blah", "+", "foo", "=", "+", "="]
out=[]
prevdone=False
for i in range(len(loop)):
    if loop[i]=="+" and loop[i+1]=="=":
        out.append("+=")
        prevdone=True
    elif not(prevdone):
        out.append(loop[i])
    else:
        prevdone=False
print(out)

它遍历列表,并检查当前和下一个字符是否满足条件。如果满足条件,它将添加+=并跳过下一项。

我考虑过使用"".join(list)string.split(""),但这在多个字符元素上不起作用(我认为)。

至于通用函数,它可以被修改如下:

def loopReplace(loopList, item1, item2):
    out=[]
    prevdone=False
    for i in range(len(loopList)):
        if loopList[i]==item1 and loopList[i+1]==item2:
            out.append(str(item1)+str(item2))
            prevdone=True
        elif not(prevdone):
            out.append(loopList[i])
        else:
            prevdone=False
    return out

我希望该函数能够接受任何序列和任何替换。 - R.O.S.S
@R.O.S.S 已经为您添加了这个。 - Mutantoe

1
list = [3, "blah", "+", "foo", "=", "+", "="]

for index, item in enumerate(list):
    if item =='+' and list[index +1]=='=':
        list[index] = "+="
        del list[index + 1]

print(list)

你的打印语句应该是 print(list),因为原问题涉及到 Python 3。 - Kyrubas
它会引发异常,指出迭代器在迭代过程中改变了其大小。 - R.O.S.S
1
@R.O.S.S 不会的。你试过了吗?你遇到异常了吗? - Monodeep
如果最后一个字符是 "+",那么这将引发“索引超出范围”的错误,因为它仍会尝试检查下一个字符是否为“=”。 - jsiller

1

好的,我看到这些答案后,我想我会发布我的解决方案。我做了一个小包装函数。

def replace(sequence, replacement, lst, expand=False):
    out = list(lst)
    for i, e in enumerate(lst):
        if e == sequence[0]:
            i1 = i
            f = 1
            for e1, e2 in zip(sequence, lst[i:]):
                if e1 != e2:
                    f = 0
                    break
                i1 += 1
            if f == 1:
                del out[i:i1]
                if expand:
                    for x in list(replacement):
                        out.insert(i, x)
                else:
                    out.insert(i, replacement)
    return out

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接