[英]Building IP addresses from string
編寫一個程序,該程序確定在十進制字符串的何處添加句點,以使結果字符串是有效的IP地址。 一個字符串可能有多個有效IP地址,在這種情況下,您應該打印所有可能性。 例如,
"19216811"
,九個可能的IP地址中的兩個包括192.169.1.1
和19.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.