Сортировка списка по домену верхнего уровня (edu, com, org, in) - PullRequest
0 голосов
/ 01 марта 2019

Учитывая список,

url = ["www.annauniv.edu", "www.google.com", "www.ndtv.com", "www.website.org", "www.bis.org.in", "www.rbi.org.in"];

Сортировка списка по домену верхнего уровня (edu, com, org, in) Я очень плохо знаком с python, я попытался решить эту проблему, отсортировав список по второму последнему члену, т. Е. "D, o, г, я».Но вывод, который я получаю, не такой, как ожидалось, не могли бы вы помочь мне понять, почему?


url = ["www.annauniv.edu", "www.google.com", "www.ndtv.com", "www.website.org", "www.bis.org.in", "www.rbi.org.in"]
def myFn(s):
    return s[-2]

print sorted(url,key=myFn) `

я получаю следующий вывод:

['www.annauniv.edu', 'www.bis.org.in', 'www.rbi.org.in', 'www.google.com', 'www.ndtv.com', 'www.website.org']

Нокогда я пытаюсь с этим списком url=["x.ax","u.ax","x.cx","y.cx","y.by"] я получаю основной результат, то есть

['x.ax', 'u.ax', 'y.by', 'x.cx', 'y.cx']

Ответы [ 7 ]

0 голосов
/ 01 марта 2019

s[-2] означает взять второй справа символ;так что для "www.annauniv.edu" это будет "d" в ".edu".Таким образом, вы сортируете по второму последнему символу.

Вместо этого попробуйте:

return s.split('.')[-1]

split('.') разделит вашу входную строку (например, "www.annauniv.edu")в список, разделенный на «.»символ (т. е. ["www", "annauniv", "edu"]), а затем [-1] выберет первый справа (т. е. "edu")

edit:

Хорошо, я вижу, что вы хотите отсортировать в определенном порядке, отличном от фактической сортировки. В этом случае вам нужно как-то определить этот порядок. Вот один из способов:

def myFn(s):
    preferred_order = ["edu", "com", "org", "in"]
    tld=s.split('.')[-1]
    return preferred_order.index(tld)

Вызов .index()возвращает позицию, которую строка занимает в списке preferred_order (это произвольное имя переменной, вы можете использовать foo или что-нибудь еще).

Итак, tld=s.split('.')[-1] устанавливает tld в нечто вроде "com "или" edu ". Затем preferred_order.index(tld) ищет tld в списке preferred_order и возвращает его позицию (начиная с 0). Так что для" edu "вы получите 0; для" org "вы получите 2 и т. д. В результате вы будете сортировать по порядку, указанному в preferred_order.

Он задохнется с ValueError, если он достигнет вас.хотя я и не думал. В этом случае вы можете иметь значение по умолчанию:

def myFn(s):
    preferred_order = ["edu", "com", "org", "in"]
    tld=s.split('.')[-1]
    try:
        ranking = preferred_order.index(tld)
    except ValueError:
        ranking = 99999 # to sort unknowns at end; use -1 to sort at beginning 
    return ranking
0 голосов
/ 01 марта 2019

Ни один из ответов не работает, как вы ожидали.Это будет работать точно так, как задумано.Для уточнения прочитайте комментарии под вопросом.

urls = ["www.annauniv.edu", "www.google.com", "www.ndtv.com", "www.website.org", "www.bis.org.in", "www.rbi.org.in"]

def func(x):
  x = x.split('.')[-1]
  print(x)
  if x == 'edu':
    return 'e'
  elif x == 'com':
    return 'm'
  elif x == 'org':
    return 'o'
  else:
    return 'z'

print(sorted(urls, key=func))

Вывод: Order -> [edu, com, org, in]

['www.annauniv.edu', 'www.google.com', 'www.ndtv.com', 'www.website.org', 'www.bis.org.in', 'www.rbi.org.in']

Обновление : IЯ возвращаю алфавиты, чтобы поддерживать необходимый порядок.

0 голосов
/ 01 марта 2019

В целом, вы, вероятно, также хотите, чтобы "www.google.com" предшествовал "www.ndtv.com", а "web3.example.com" предшествовал "www.example.com", верно?Вот как вы можете это сделать:

urls = ["www.annauniv.edu", "www.google.com", "www.ndtv.com", "www.website.org", "www.bis.org.in", "www.rbi.org.in"]

def key_function(s):
    # Turn "www.google.com" into ["www", "google", "com"], then
    # reverse it to ["com", "google", "www"].
    return list(reversed(s.split('.')))

# Now this will sort ".com" before ".edu", "google.com" before "ndtv.com",
# and so on.
print(sorted(urls, key=key_function))
0 голосов
/ 01 марта 2019

Это потому, что не все TLD всегда имеют 2 символа.В настоящее время выпущено гораздо больше расширенных доменов верхнего уровня, и гораздо больше доменов верхнего уровня.

Вместо s[-2] вместо него можно использовать s.split('.')[-1].

  1. Разбить строку с . на массивы: s.split('.')

    www.bis.org.in
    > ['www', 'bis', 'org', 'in']
    
  2. Получить последний элемент: [-1]

    > 'in'
    

Кроме того, вы можете указать диктат для сортировки на основе этого, прежде чем вернуться к алфавитному порядку.

url = ["www.annauniv.edu", "www.abc.co.uk", "x.dev", "x.mom", "www.google.com", "www.ndtv.com", "www.website.org", "www.bis.org.in", "www.rbi.org.in"]

def myFn(x):
    order = {'edu': 0, 'com': 1, 'org': 2, 'in': 3}
    tld = x.split('.')[-1]
    return order[tld] if tld in order.keys() else tld

print(sorted(url, key=myFn))

вернет

['www.annauniv.edu',
 'www.google.com',
 'www.ndtv.com',
 'www.website.org',
 'www.bis.org.in',
 'www.rbi.org.in',
 'x.dev',
 'x.mom',
 'www.abc.co.uk']

То, что происходит за сценой, это числобудет отсортирован перед строкой символов.

Если TLD являются edu, com, org или in, он будет отсортирован по их соответствующему номеру.

Все остальное будет отсортировано в алфавитном порядке ссам TLD.

0 голосов
/ 01 марта 2019

Вам необходимо вернуть последнюю часть строк после точки.Используйте эту функцию в качестве своей функции.

url = ["www.annauniv.edu", "www.google.com", "www.ndtv.com", "www.website.org", "www.bis.org.in", "www.rbi.org.in"]
def myFn(s):
    return s.split('.')[-1]

print sorted(url,key=myFn) 

Редактировать

Поскольку ваши требования сложнее, чем простая буквенно-цифровая сортировка, то приведенная ниже функция выглядит логичным решением.

def myFunc(s, order=('edu','com','in','org')):
    try: return order.index(s.split('.')[-1])
    except ValueError: return len(order)
0 голосов
/ 01 марта 2019

Решение этой проблемы состоит в том, чтобы взять весь домен верхнего уровня, а не только второй или последний символ.Представьте себе случай, когда у вас было два верхних уровня, таких как «edu» и «add».Эти два не гарантируют правильную сортировку, потому что «edu» может закончиться раньше, чем «add».Итак, вот решение:

url = ['www.annauniv.edu', 'www.google.com', 'www.ndtv.com', 'www.website.org', 'www.bis.org.in', 'www.rbi.org.in']

def topLevelDomain(domain: str):
    # Split from the right, max of one split.
    # This only takes the right hand side after the last period in the string.
    return domain.rsplit('.', 1)[-1]

print(sorted(url, key=topLevelDomain))
0 голосов
/ 01 марта 2019

Поскольку вы делаете -2, то есть он получает символы, идущие от второго к последнему, поэтому некоторые вещи, оканчивающиеся на com, будут просто om, поэтому используйте:

print(sorted(url,key=lambda x: x.split('.')[-1]))

Версия Джеба заключается в том, что она использует функцию, а у Кирка - reversed, но, тем не менее, вместо него можно использовать [::-1].

Редактировать: (спасибо taurus05 за исправление)

def func(x):
    d = {'edu':'e','com':'m','org':'o'}
    return d.get(x.split('.')[-1],'z')

print(sorted(urls, key=func))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...