簡體   English   中英

從字符串構建IP地址

[英]Building IP addresses from string

編寫一個程序,該程序確定在十進制字符串的何處添加句點,以使結果字符串是有效的IP地址。 一個字符串可能有多個有效IP地址,在這種情況下,您應該打印所有可能性。 例如, "19216811" ,九個可能的IP地址中的兩個包括192.169.1.119.216.81.1

以下是我的(不完整)解決方案:

def valid_ips(string):
  def is_valid_part(part):
    return len(part) == 1 or (part[0] != 0 and int(part) <= 255)  

  def build_valid_ips(substring):
    result = []
    for i in range(1, min(4, len(substring))):
      part = substring[:i]
      if is_valid_part(part):
        for sub in build_valid_ips(substring[i:]):
          result.append(part + '.' + sub)
    return result

  return build_valid_ips(string)

這是我正在研究的書中的一個變體問題,因此我沒有解決方案。 但是,我有幾個問題

  • 這個解決方案是不正確的,因為它總是返回一個空列表,但是我不確定為什么。 似乎我正在處理歸納步驟和基本情況。 有人可以指出我正確的方向嗎?
  • 我該如何做得更好? 我知道每個遞歸調用都會生成一個新列表和多個新字符串,這會增加大量開銷,但是如何避免這種情況呢?

您的函數始終返回一個空列表,因為您從不添加任何內容以result遞歸的最底層。

build_valid_ips ,只有在遍歷從對build_valid_ips的遞歸調用獲得的值時,才追加到result ,但是那只會返回通過遍歷對build_valid_ips進一步遞歸調用而獲得的值。 遞歸必須在某個地方停止,但是在此級別上,什么都沒有追加。 結果,沒有什么要傳遞回遞歸了。

嘗試添加行

    if is_valid_part(substring):
        result.append(substring)

build_valid_ips ,在result = []result = [] 然后,您應該找到代碼,然后返回一個非空列表。

但是,結果仍然不正確。 在代碼中,沒有任何地方強制要求IP地址必須包含四個部分,因此代碼將生成錯誤的輸出,例如1.9.2.1.6.8.1.1 我將由您自己來修改代碼以解決此問題。

至於如何改進代碼,這是Code Review的一個問題。 對於像您這樣的小例子,它將永遠不會運行很長時間,我不會太擔心生成太多列表和字符串。 僅在代碼性能出現問題時才擔心這些事情。

鑒於IP必須包含四個不同的部分,您可以使用遞歸來生成具有分組可能性的列表:

s = "19216811"
def ips(d, current = []):
  if not d:
     yield current
  else:
     for i in range(1, len(s)):
       yield from ips(d[i:], current + [d[:i]])

final_ips = list(filter(lambda x:all(len(i) > 1 for i in x[:2]), [i for i in ips(s) if len(list(filter(None, i))) == 4]))
new_ips = ['.'.join(a) for i, a in enumerate(final_ips) if a not in final_ips[:i]]

輸出:

['19.21.6.811', '19.21.68.11', '19.21.681.1', '19.216.8.11', '19.216.81.1', '19.2168.1.1', '192.16.8.11', '192.16.81.1', '192.168.1.1', '1921.68.1.1']

暫無
暫無

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

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