【问题标题】:Replace sequence in list with a value in Python用 Python 中的值替换列表中的序列
【发布时间】:2015-07-13 02:06:13
【问题描述】:

我想用另一个元素(元素)替换列表中两个特定的一个接一个的元素。
例如 - 将["+", "="] 替换为["+="]

输入:

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

输出:

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

【问题讨论】:

  • 你能展示一下到目前为止你尝试了什么吗?
  • 我已经使用 zip 为它做了一个小包装,但我想知道是否有更简短、优雅、Pythonic 的方式(一些好的列表理解或其他方式)。
  • @R.O.S.S 你能添加你的尝试吗?

标签: python list python-3.x replace sequence


【解决方案1】:

以下,虽然 非常 对于长列表效率低,但这将起作用:

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 已为您添加。
【解决方案2】:
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 有关。
  • 它会引发异常,说迭代器在迭代期间改变了它的大小。
  • @R.O.S.S 不会的。你试过了吗?你得到异常了吗?
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-29
    • 2022-11-10
    • 2023-01-11
    • 1970-01-01
    • 2019-07-28
    • 2010-11-07
    • 2010-12-05
    • 2022-07-03
    相关资源
    最近更新 更多