给出列表,
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']
答案 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]
。
将带有.
的字符串拆分为数组:s.split('.')
www.bis.org.in
> ['www', 'bis', 'org', 'in']
获取最后一个元素:[-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本身的字母顺序进行排序。