根据顶级域(edu,com,org,in)对列表进行排序

时间:2019-03-01 04:30:19

标签: python list

给出列表,

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,r,i”)对列表进行排序来解决此问题。但是我得到的输出不是预期的,您能帮我理解为什么吗?


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"]时,我得到了corect结果,即

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

7 个答案:

答案 0 :(得分:2)

因为您正在做-2,所以它得到倒数第二个字符,所以像com这样的结尾只是om,所以请使用:

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

Jab的版本使用的是函数,Kirk的版本使用的是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))

答案 1 :(得分:2)

更一般而言,您可能还希望“ 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))

答案 2 :(得分:1)

您需要在一段时间后返回字符串的最后一部分。使用它作为功能。

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)

答案 3 :(得分:1)

s[-2]表示采用从右至第二的字符;因此,对于“ www.annauniv.edu”,该名称应为“ .edu”中的“ d”。所以您要排序倒数第二个字符。

相反,请尝试:

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

split('.')会将您的输入字符串(例如“ www.annauniv.edu”)分割为一个列表,并以“。”分隔。字符(即[“ www”,“ annauniv”,“ edu”],然后[-1]将从右侧选择第一个字符(即“ edu”)

编辑:

好的,所以我看到您希望按照除实际整理之外的特定顺序进行排序。在这种情况下,您需要以某种方式定义该顺序。这是一种方法:

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;对于“组织”,您将得到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

答案 4 :(得分:1)

所有答案都没有达到您的预期。这将按预期工作。为了澄清起见,请阅读问题下方的评论。

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))

输出:订单-> [edu,com,org,in]

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

更新: 我要返回字母以保持所需的顺序。

答案 5 :(得分:0)

此问题的解决方案是采用整个顶级域名,而不仅仅是倒数第二个字符。想象一下,您有两个顶级级别,例如“ 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))

答案 6 :(得分:0)

这是因为并非所有TLD都始终具有2个字符。如今,随着更多的顶级域名(TLD)发布,那里的顶级域名(TLD)越来越长。

您可以使用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本身的字母顺序进行排序。