【发布时间】:2018-10-11 04:56:22
【问题描述】:
有没有比这更 Pythonic、紧凑、直观的方式来对字母等级进行排序(不使用自定义字典)?
grades = ['B-','C','B','C+','A','D+','B+','C-','A+','D','A-']
sorted(grades, key=lambda g: (g[0], '+ -'.index((g+' ')[1])) )
['A+', 'A', 'A-', 'B+', 'B', 'B-', 'C+', 'C', 'C-', 'D+', 'D']
为了得到'X-','X','X+'的比较数字顺序,我做了一个空格''的hacky追加,这样g[1]总是存在,所以我可以使用@987654324 @ 获取修饰符 '+ -' 的等级。
(受到this question的启发)
【问题讨论】:
-
更直观可能意味着不那么紧凑。你在乎哪一个?
-
实际上……您有一组固定的 11 个值。为什么 dict 不会更直观?
gradedict = {grade: i for i, grade in enumerate('A+ A A- B+ B B- C+ C C- D+ D'.split())}很可能在不止一个地方有用,然后它只是sorted(grades, key=gradedict.get)。 -
我想如果我们要对成绩列进行大量排序或键入,我们会在之后用空格增加单字母成绩 ('C')。但是,如果我们要走得那么远,更容易使用 dict 来翻译 'A':90、'B+':85 等。本质上就像 pandas 或 R Categorical
-
静态字典的另一个优点是,如果你开始获得意想不到的成绩,它可以引发异常,而不是默默地将
S视为比D差而不是比A+好,或者a比D差,而不是等于A等等。(虽然因为我使用get而不是__getitem__,错误可能会非常神秘而不是有用,所以也许不要这样做那……) -
另外,它可能会更快(这在您的程序中可能无关紧要,但是那些希望以牺牲可读性为代价来节省 3 次击键的人通常愿意将这 3 次击键花费在节省 20ns,所以……)
标签: python string sorting idioms