【问题标题】:Python- Filling Spaces in a List Between Two Elements with RecursionPython-用递归填充两个元素之间的列表中的空格
【发布时间】:2020-03-31 03:59:42
【问题描述】:

我有一个潜在的清单,会以如下形式提供给我:

['A', '-', 'A', 'a', '-', '-','-','a','A','-','-']

使用递归,我需要填充相似元素之间的空格,或者填充到列表列表的末尾,如下所示:

['A', 'A', 'A', 'a', 'a', 'a','a','a','A','A','A']

我能够在没有递归的情况下做到这一点,但是我对如何递归地执行这一点感到困惑。任何帮助将不胜感激!

【问题讨论】:

  • 我认为所需的输出不会包含中间的空格。 ['A', 'A', 'A', 'a', 'a', 'a','a','a','A','A','A'] 将被 python 自动转换为 ['A','A','A','a','a','a','a','a','A','A','A']。我猜你想在列表元素中添加空格,是吗?

标签: python string list recursion


【解决方案1】:

您需要做的就是检查'-' 是否存在于list 中,如果是,则将单个'-' 替换为相邻元素并再次递归,如果否,则返回list

lst = ['A', '-', 'A', 'a', '-', '-','-','a','A','-','-']
def recur(lst):
    if '-' in lst:    
        for i, j in enumerate(lst):
            if j == '-':
                try:
                    lst[i] = lst[i-1]
                except IndexError:
                    lst[i] = lst[i+1]
                return recur(lst)
    else: return lst
print(recur(lst))

或者,没有循环:

def recur(lst):
    if '-' in lst:    
        i = lst.index('-')
        try:
            lst[i] = lst[i-1]
        except IndexError:
            lst[i] = lst[i+1]
        return recur(lst)
    else: return lst

编辑: 如果序列以两个-s 开头,上述方法将超过最大递归深度。在这种情况下,您可以这样做:

def recur(lst):
    if '-' in lst:    
        for i, j in enumerate(lst):
            if j == '-':
                try:
                    lst[i] = lst[i-1]
                except IndexError:
                    lst[i] = lst[i+1]
                if lst[i] != '-': return recur(lst)

    else: return lst

输出:

['A', 'A', 'A', 'a', 'a', 'a', 'a', 'a', 'A', 'A', 'A']

【讨论】:

  • 非常感谢!有没有办法在不使用除了 IndexError 的情况下实现这一点?
  • 是的,将try: 替换为if i!= 0: 并将except IndexError: 替换为else:
【解决方案2】:

您可以将递归与列表切片一起使用:

data = ['A', '-', 'A', 'a', '-', '-','-','a','A','-','-']
def update_dash(d, start='A'):
   return [] if not d else [d[0] if d[0] != '-' else start]+update_dash(d[1:], d[0] if d[0].isalpha() else start)

print(update_dash(data))

输出:

['A', 'A', 'A', 'a', 'a', 'a', 'a', 'a', 'A', 'A', 'A']

【讨论】:

    【解决方案3】:
    def rec(_list, currentIndex, prevChar):
        if currentIndex == len(_list): # End of list
            return
        if _list[currentIndex]=='-': # If current character is '-', replace it with previous character
            _list[currentIndex] = prevChar
        rec(_list,currentIndex+1,_list[currentIndex]) # Recurse for rest of the list
    
    _list1  = ['A', '-', 'A', 'a', '-', '-','-','a','A','-','-']
    _list2  = ['-', 'A', '-',]
    # Assuming initial `prevChar` is 'A' for cases when list starts directly with '-' characters. Ex ['-','A','-']
    rec(_list1,0,'A')
    rec(_list2,0,'A')
    print(_list1)
    print(_list2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-22
      • 2021-12-03
      • 2019-11-24
      相关资源
      最近更新 更多