按姓氏排序

时间:2015-03-29 20:03:33

标签: python

我如何获得以下姓氏的人:

l = ['John Fine', 'Doug Biro', 'Jo Ann Alfred']
--> Jo Ann Alfred

到目前为止我一直在做:

sorted(l, key=itemgetter(-1))[0]

这是推荐的方法,还是有更好的选择?

3 个答案:

答案 0 :(得分:6)

你实际上按最后一个字母排序而不是名字,假设空格后面的最后一个字总是使用分割的姓氏:

l = ['John Fine', 'Doug Biro', 'Jo Ann Alfred']

sorted(l, key=lambda x: x.rsplit(None,1)[-1])

如果您只想使用基于姓氏的最小值,请使用min

print(min(l,key=lambda x: x.rsplit(None,1)[-1]))

反向使用max

lambda x: x.rsplit(None,1)[-1]实际上将字符串拆分到最后一个空格,并使用该值作为排序键。

答案 1 :(得分:4)

当你必须分钟时,min不要sort

min(l, key=lambda x: x.rsplit(' ', 1)[1])

修改

我认为更好的解决方案是: 1。比较姓氏, 2。如果相同,则比较第一个。我们可以使用元组轻松实现这种行为:

min(l, key=lambda x:tuple(reversed(x.rsplit(None, 1))))

答案 2 :(得分:0)

对于简单名称来说,这是可以的,但是在大型名称数据库中,很可能会有一些例外,例如Charles(de Gaulle),可以适当地以'de Gaulle'或Werner(冯·布劳恩(Von Braun),但请注意路德维希·范(贝多芬)。最后两个取决于yuk上v的大小写。有关更多学步鞋,请参见此处...

http://www.english-for-students.com/Listing-Names.html

因此,对于改进的排序方式(仍不完整),您需要使用字典来检查(如果有的话)姓氏减一。

首先检查名称是否包含2个以上的单词,然后将name [-2]与其他排序单词列表进行比较。如果有匹配项,则对组合词进行排序

names=["Abraham Van Helsing", "Ludwig van Beethoven"]

def sortname(name):
   sort_prefix=['Van', 'Von']
   parts=name.split()
   if len(parts) > 2 and parts[-2] in sort_prefix:
       sortname = " ".join(parts[-2:])
   else:
       sortname=parts[-1]
   return sortname

print([sortname(x) for x in names])

然后,您可以使用与上述相同的方法处理'sortname(name)'的输出。这只是一个开始,而不是对该问题的完整分析

尤其是您会发现,这对于美国著名科学家 Robert Jemison(范·德格拉夫)(Van de Graaff)来说是失败的,需要进行额外的测试。