2

我想在一个字符串中找到一个给定数字之和的连续数字。

例子:

a="23410212"数字is=5——输出23,41,410,0212,212

此代码不起作用。我需要解决什么问题?

def find_ten_sstrsum():
    num1="2825302"
    n=0;
    total=0;
    alist=[];
    ten_str="";
    nxt=1;
    for n in range(len(num1)):
        for n1 in range(nxt,len(num1)):
            print(total)
            if(total==0):
                total=int(num1[n])+int(num1[n1])
                ten_str=num1[n]+num1[n1]
            else:
                total+=int(num1[n1])
                ten_str+=num1[n1]
            if(total==10):
                alist.append(ten_str)
                ten_str=""
                total=0
                nxt+=1
                break
            elif(total<10):
                nxt+=1
     return alist 
4

2 回答 2

5

这种(某种)单线将起作用:

def find_ten_sstrsum(s, n):
  return list(  # list call only in Python 3 if you don't want an iterator
    filter(
      lambda y: sum(map(int, y))==n, 
      (s[i:j] for i in range(len(s)) for j in range(i+1, len(s)+1)))
  )

>>> find_ten_sstrsum('23410212', 5)
['23', '41', '410', '0212', '212']

这在所有可能的切片上使用嵌套生成器表达式,并过滤掉具有正确数字和的切片。当然,这远非最佳(尤其是对于长字符串),因为一旦数字和超过 ,就应该停止内部循环,但应该给您一个想法。n

一个更具性能和可读性的解决方案是生成器函数

def find_ten_sstrsum(s, n):
  for start in range(len(s)):
    for end in range(start+1, len(s)+1):
      val = sum(map(int, s[start:end]))
      if val > n:
        break
      if val == n:
        yield s[start:end]

>>> list(find_ten_sstrsum('23410212', 5))
['23', '41', '410', '0212', '212']

当然也阅读summap

于 2017-01-24T22:19:00.840 回答
0

您的功能有几个问题。最重要的是,您无法为其提供不同的数据来处理。您已经硬编码来处理一个特定的字符串和总共 10 个。即使您的示例使用 n=5,您甚至已经在其中编写了带有“10”的变量名。您的函数应该有两个输入参数:给定的字符串和目标总和。

注意:schwobaseggl 刚刚发布了一个可爱的 Pythonic 解决方案。但是,我会继续写这个,以防你需要一个更接近你当前学习水平的函数。

您有多个逻辑路径,因此很难遵循您处理数据的方式。我推荐一种稍微不同的方法,以便您可以干净地对待每个部分总和:

for start in range(len(num1)):
    total = 0     # Start at 0 each time you get a new starting number.
    sum_str = ""
    for last in num1[start:]:
        print(total)
        # Don't create separate cases for the first and other additions.
        this_digit = num1[last]
        total += int(this_digit)
        ten_str += this_digit

        # If we hit the target, save the solution and
        #   start at the next digit
        if(total == target):
            alist.append(ten_str)
            break

        # If we passed the target, just
        #   start at the next digit
        elif(total > target):
            break

 return alist 

现在,这并不能完全解决的所有问题,而且我还没有为您完成一些会计工作(变量初始化、定义等)。但是,我认为它使您朝着正确的方向前进并保留了代码的精神。

于 2017-01-24T22:31:39.623 回答