簡體   English   中英

Python程序找到等於n的連續數字值之和?

[英]Python program find sum of consecutive number values equal to number n?

我想在一個字符串中找到相加的數字,這些數字加起來等於一個給定的數字。

例:

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 

這種(一類)內襯可以工作:

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']

這將在所有可能的切片上使用嵌套的生成器表達式 ,並過濾出具有正確數字和的切片 當然,這遠不是最佳的(特別是對於長字符串而言),因為一旦digit-sum超過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

您的功能有幾個問題。 最重要的是,您沒有辦法為它提供不同的數據。 您已經對其進行了硬編碼,以處理一個特定的字符串,總共可以處理10 字符串。即使您的示例使用n = 5,您甚至編寫了帶有“十”的變量名。 您的函數應具有兩個輸入參數:給定的字符串和目標和。

注意: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 

現在,這並沒有解決相當你所有的問題,我沒有做一些你會計工作(變量初始化, 高清線等)。 但是,我認為這會朝正確的方向前進,並保留了代碼的精髓。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM