在Python函数中使用递归输出元组列表

在Python函数中使用递归输出元组列表,python,function,recursion,encode,Python,Function,Recursion,Encode,我对python非常陌生,非常感谢您的帮助。基本上,我输入一个字符串,如果您愿意,返回“encoded”字符串。我的功能有问题,但我不知道哪里出了问题 def encode_it(x): output = [] counter = 1 while x[0] != x[-1]: if x[0] == x[1]: counter += 1 return encode_it(x[1:]) else:

我对python非常陌生,非常感谢您的帮助。基本上,我输入一个字符串,如果您愿意,返回“encoded”字符串。我的功能有问题,但我不知道哪里出了问题

def encode_it(x):
    output = []
    counter = 1
    while x[0] != x[-1]:
        if x[0] == x[1]:
            counter += 1
            return encode_it(x[1:])
        else:
            output += (x[0],counter)
            counter = 1
            return encode_it(x[1:])

    return output
我想要的结果是:

>>>encode_it("qqqqppttyl")
[("q",4),("p",2),("t",2),("y",1),("l",1)]
我真的非常感谢任何帮助,我正在学习python并尝试递归,如果没有递归,还有更简单的方法,我会非常感激:)

谢谢大家!! 为了响应L3viathan的代码,我对其进行了修改,使其能够输出结果,但它没有将最后一个字符添加到列表中:

def encode_it(x):
last_char = None
num = 0
result = []
for char in x:
    t = ( )
    if last_char == char:
        num += 1
    else:
        if last_char:
            t += last_char,num
            result += t
        last_char = char
        num = 1
return result 
如果我调用encode_it(“qqeerrw”),我得到的结果是:

['q', 3, 'e', 2, 'r', 2] #it's leaving out the w here?
另外,我有一个空元组“t”和一个空列表“result”的原因是,我希望每个字符都在其自己的元组中,并带有其计数…如下所示:

[("q",3),("e",2),("r",2),("w",1)]

代码的一个问题是,
output
在每次递归调用时都被重新初始化为空列表。在最后一种情况下,当您完成整个字符串时,将返回新创建的空列表(然后通过所有递归调用返回)


这是一个没有递归的解决方案,作为生成器:

def encode_it(x):
    last_char = None
    num = 0
    for char in x:
        if last_char == char:
            num += 1
        else:
            if last_char:
                yield (last_char, num)
            last_char = char
            num = 1
用法:

>>> list(encode_it("qqqqppttyl"))
[('q', 4), ('p', 2), ('t', 2), ('y', 1)]

其工作方式是迭代字符串,并测试当前字符是否与保存在
last\u char
中的字符相同。如果是这样,我们只需增加一个计数器。如果不是,我们将
生成最后一个字符的元组及其计数,并为
last\u char
num
设置新值


A不返回列表,而是一个生成器对象,因此要将其转换为列表,可以对其调用
list()

此任务可以通过以下方法轻松完成:

然后:

该问题的简单递归(如所问)解决方案:

def encode_it(x):
    if not x:  # base case: empty string
        return []
    i, c = 1, x[0] 
    while i < len(x) and c == x[i]:
        i += 1
    return [(c, i)] + encode_it(x[i:])
def编码(x):
如果不是x:#基本情况:空字符串
返回[]
i、 c=1,x[0]
而i
使用
count
方法和一行
for
循环,您可以轻松地避免递归

def encode_it(x):
   return [(char,x.count(char)) for char in x]
list.count(x)
返回x在列表中出现的次数。

凌乱的单行线:

def encode_it(x):
    return [(c,x.count(c,i,next((i for i, v in enumerate(x) if v != c), -1))) for i, c in enumerate(x) if x.index(c) == i]

若相同的字符也不在序列中,而不使用递归函数,下面的解决方案也将起作用

例如,给定的字符串是

>>>groupBy("qqqqqq1212")
[('q', 6), ('1', 2), ('2', 2)]

无递归函数的程序

str = "qqqqqq1212tytl"

def groupBy(str):
   result = []
   count = {}
   for c in str:
      if c in count:
          count[c] += 1
      else:
          count[c] = 1

   for key in count:
      if count[key] >= 1:
          result +=  [(key, count[key])]            

   return result           


print(groupBy(str))

请让我知道,如何使用递归函数更好地进行编码

您应该指定,如果字符总是按块的顺序排列;可能不会,但是您应该更改您的示例。此外,缩进是错误的,
def
后面的块应该缩进代码在哪一点上的行为不正确?顺便说一句:这些东西最好使用测试驱动开发(TDD)来开发。从一个测试开始,您提供一个空字符串,然后是一个包含一个字符的字符串,然后是一个包含多个、相等字符的字符串,等等。
>>>groupBy("qqqqqq1212")
[('q', 6), ('1', 2), ('2', 2)]
>>>groupBy("qqqqqq1212tytl")
[('y', 1), ('q', 6), ('1', 2), ('l', 1), ('t', 2), ('2', 2)]
str = "qqqqqq1212tytl"

def groupBy(str):
   result = []
   count = {}
   for c in str:
      if c in count:
          count[c] += 1
      else:
          count[c] = 1

   for key in count:
      if count[key] >= 1:
          result +=  [(key, count[key])]            

   return result           


print(groupBy(str))