Reputation: 615
I want to replace example two specific one-after-one going elements in a list with another element (elements).
For example - replace ["+", "="]
with ["+="]
:
Input:
[3, "blah", "+", "foo", "=", "+", "="]
Output:
[3, "blah", "+", "foo", "=", "+="]
Upvotes: 4
Views: 2782
Reputation: 697
The following, though very inefficient for long lists this will work:
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)
It iterates through the list and checks if the current and following characters meet conditions. If they do, it will add +=
and skip the next item.
I have considered using "".join(list)
and string.split("")
but that wouldn't (I don't think) work for multiple-character elements.
As for a general function, it could be modified as such:
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
Upvotes: 2
Reputation: 615
Ok, as I see these answers I think I'll post my solution. I've done a little wrapper function.
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
Upvotes: 1
Reputation: 1392
list = [3, "blah", "+", "foo", "=", "+", "="]
for index, item in enumerate(list):
if item =='+' and list[index +1]=='=':
list[index] = "+="
del list[index + 1]
print(list)
Upvotes: 1