我如何获得以下姓氏的人:
l = ['John Fine', 'Doug Biro', 'Jo Ann Alfred']
--> Jo Ann Alfred
到目前为止我一直在做:
sorted(l, key=itemgetter(-1))[0]
这是推荐的方法,还是有更好的选择?
答案 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的大小写。有关更多学步鞋,请参见此处...
因此,对于改进的排序方式(仍不完整),您需要使用字典来检查(如果有的话)姓氏减一。
首先检查名称是否包含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)来说是失败的,需要进行额外的测试。