Я хочу более эффективный ответ только с этими методами - PullRequest
0 голосов
/ 28 ноября 2018

Я сам учил себя питону в течение последних 2 недель.Сегодня я столкнулся с проблемой, и у меня есть очень раздражающее решение (я чувствую себя плохо из-за того, кто должен ее читать).Итак, во-первых, я представлю проблему и ее решение.

Проблема: завершите функцию getHost (), которая принимает аргумент из одной строки, представляющий URL-адрес, и возвращает строку, которая соответствует следующему за последним разделу имени хоста.Например, учитывая URL "http://www.example.com/",, функция

вернет строку" example ". Учитывая URL" ftp: //this.is.a.long.name.net / path / to / some / file.php", функция будет возвращать строку« name ». Хотя разделы пути и имени файла в URL являются необязательными, вы можете предположить, что полное имя хоста всегда сопровождаетсяодиночная косая черта ("/").

Мое решение:

def getHost(x):
    newstring = ""
    listofx = []
    for i in range(len(x)):
        listofx.append(x[i])
    for j in range(2):
        a = listofx.index("/")
        listofx.reverse()
        for k in range(a+1):
            listofx.pop()
        listofx.reverse()
    b = listofx.index("/")
    for g in range(len(listofx)-b):
        listofx.pop()
    for t in range(listofx.count(".")-1):
        for o in range(listofx.index(".")+1):
            listofx.reverse()
            listofx.pop()
            listofx.reverse()
    for f in range(len(listofx)-listofx.index(".")):
        listofx.pop()
    for h in range(len(listofx)):
        newstring = newstring + listofx[h]
    print (newstring)

Я НЕНАВИЖУ свое решение, потому что посмотрите, сколько циклов я использовал. Я чувствовал, что у меня нет выбора, так как строкиявляются неизменными. Я был бы признателен, если бы кто-нибудь показал мне решение с использованием циклов while и методов find () / rfind (). Я не хочу продолжать преобразовывать строки в списки для решения проблем такого типа.

Ответы [ 4 ]

0 голосов
/ 28 ноября 2018

На самом деле, более простая версия, которая не требует rfind:

def getHost(x):
    index1 = x.find('//')
    index2 = x.find('/', index1+2)
    return(x[:index2].split('.')[-2])



print(getHost("ftp://this.is.a.long.name.net/path/to/some/file.php"))
print(getHost("http://www.example.com/"))
0 голосов
/ 28 ноября 2018

Предполагая, что ваш URL всегда имеет двойную косую черту, вы можете использовать что-то вроде следующего:

url = "http://www.example.com/"

url = url.split("/")
url = url[2].split(".")
getHost = url[-2]

print(getHost)
0 голосов
/ 28 ноября 2018

Использование find и rfind:

def getHost(x):
    index1 = x.find('//')
    index2 = x.find('/', index1+2)
    index3 = x.rfind('.',index1+2, index2)
    return(x[:index3].split('.')[-1])
0 голосов
/ 28 ноября 2018

Да, есть лучший (питонический) способ

def extract(data):
    print(data.split('/')[2].split('.')[-2])

extract("http://www.example.com/")
extract("ftp://this.is.a.long.name.net/path/to/some/file.php")

Вывод (очевидно)

example
name
...