2016-11-09 51 views
1

我已经设置了一个任务,通过像这样的函数参数对给定的元组列表进行排序。我必须让函数只用两行代码来操作。 排序顺序是这样: 1)级 2)姓 3)用的名字如何通过数字(降序)和按字母顺序对元组的相同索引进行排序? [Python]

因此,例如,一个文档测试将是:

sortStudents([('Tim Smith', 54), ('Anna Smith', 88), ('Barry Thomas', 88)]) 

这是我到目前为止有:

def sortStudents(a): 
    return (sorted(a, key=lambda x: (-x[1], x[0].split()[1], x[0].split()[0]))) 

我已经完成了这些测试。然而,我无法通过的最后一个文档测试是使用按字母顺序排列的文档,而不是数字文档。而当我按降序排列数值(按索引)时,它会同时颠倒按字母排序的排序。 doctest的一个例子是:

sortStudents([('Tim Jones', 'C'), ('Anna Smith', 'B'), ('Barry Thomas', 'A')]) 

在此先感谢。

+0

你确实知道等级只是一个字母吗? –

+0

在这个任务中是的。 –

+0

@MorganThrapp你还在误解它,你提到的帖子是关于不同索引的讨论,我说的是元组的相同索引,但是参数类型不同。 –

回答

0

您需要检查等级(字符串或整数),以确定如何排序要做到:

def sortStudents(a): 
    return sorted(a, key=lambda x: [-x[1] if isinstance(x[1], int) else x[1]] 
            + x[0].split()[::-1]) 

你也可以将名字分裂一次,扭转名单,而不是分裂两次。

+0

[已回答]非常感谢,我认为这是沿着类型问题的线索! –

+0

小心谨慎,如果列表中包含混合类型,那么这将在Python 3上抛出异常,因为在3个字符串中并且不可比较。在Python 2中,它将按照该名称的所有字符串等级将所有数字等级分组。这可能是期望的行为。 –

-2

你可以尝试:

def sortStudents(a): 
    return (sorted(a, key=lambda x: (-int(str(x[1]).replace("A","90").replace("B","80").replace("C","70")), x[0].split()[1], x[0].split()[0]))) 

好像有点傻的锻炼,但这种做什么,你需要做的,我想。

>>> a = [('Tim Smith', 54), ('Anna Smith', 88), ('Barry Thomas', 88)] 
>>> b=[('Tim Jones', 'C'), ('Anna Smith', 'B'), ('Barry Thomas', 'A')] 
>>> sortStudents(a) 
[('Anna Smith', 88), ('Barry Thomas', 88), ('Tim Smith', 54)] 
>>> sortStudents(b) 
[('Barry Thomas', 'A'), ('Anna Smith', 'B'), ('Tim Jones', 'C')] 
+0

对不起,我没有解释清楚,这两行应该包括定义和正文。所以正好有一行代码为函数体本身。 –

+0

这是非常单一的。你为什么使用'try/except'来做这件事?特别是抓住所有'除了'。 –

+0

@MorganThrapp,我同意,但如果你问一个愚蠢的问题,你应该期待一个愚蠢的答案! –

相关问题