【问题标题】:How to remove neighbouring letter if they are the same using enumerate?如果使用枚举相同,如何删除相邻的字母?
【发布时间】:2021-11-07 14:46:14
【问题描述】:
我正在尝试使用枚举来解决此练习,但我不知道如何实现该值。我以数学的方式说,如果索引和索引+1 字母相同,则什么也不做,如果即将到来的字母不同,则写字母。但我不知道如何在python中做到这一点
期望的结果aaabbbaas => abas。
def zad6(string):
b =""
for index,letter in enumerate(string):
if letter[index] == letter[index+1]:
b += None
else:
b += letter
return b
print(zad6("aaabbbaas"))
【问题讨论】:
标签:
python
for-loop
indexing
enumerate
【解决方案1】:
这里是使用enumerate 修复您的代码,您可以检查之前的每个字母是否相同,除了第一次(索引 == 0):
def zad6(string):
for index, letter in enumerate(string):
if index == 0:
b = letter
elif letter != string[index-1]:
b += letter
return b
print(zad6("Baabba"))
输出:'Baba'
注意。这考虑大小写,'B'和'b'会不同,如果你想忽略大小写使用letter.lower() != string[index-1].lower()
另类
只是为了展示一个有效的解决方案,在现实生活中你可以使用itertools.groupby:
from itertools import groupby
string = "Baabba"
''.join(l for l,_ in groupby(string))
【解决方案2】:
只有当你有东西要追加时才追加,没有必要追加 None (事实上,它不起作用)。另外,您应该检查字符串中是否有下一个字符,否则它将在最后一次迭代中失败
def zad6(string):
b = ""
for index,letter in enumerate(string):
if index == len(string)-1 or letter != string[index+1]:
b+=letter
return b
print(zad6("Baabba"))
【解决方案3】:
这是一种不使用for 循环的替代方法,看起来更简单:
from operator import itemgetter
def zad6(string):
filt = filter(lambda x: x[1] != string[x[0] - 1], enumerate(string))
return ''.join(map(itemgetter(1), filt))
assert zad6('aaabbbaas') == 'abas'
assert zad6('Baabba') == 'Baba'