【问题标题】: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'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-03
        • 1970-01-01
        • 1970-01-01
        • 2016-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多