2016-11-09 4 views
1

私はタプルのリストをこのような関数のパラメータでソートするタスクを設定しました。私はコードの2行だけで動作する関数を取得する必要があります。 ソート順序は次のようなある: 1)グレード 2)姓 3)Forenameタプルの同じインデックスを数値(降順)およびアルファベット順に並べ替えるにはどうすればよいですか? [Python]

したがって、たとえば1 doctestのは次のようになります。

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は、数値的ではなくアルファベット順のものです。そして、数値を降順にソートすると(インデックスで)、アルファベット順の並べ替えが同時に行われます。 doctestの例は:

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

ありがとうございます。

+0

グレードが正確に1文字であることを確認していますか? –

+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]) 

ます。また、名前を一度に分割し、リストを逆にします、 2回に分割するのではなく、

+0

[回答]おかげさまで、タイプ問題のラインに沿ったものだと思った! –

+0

3つの文字列とintが比較できないため、リストに混合型が含まれていると、Python 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

申し訳ありませんが、私はうまく説明していませんでした.2行に定義と本文の両方が含まれている必要があります。そのため、関数本体自体のコードはちょうど1行です。 –

+0

これは非常に独立したものです。なぜあなたは 'try/except'を使っていますか?そして、とりわけ、すべてが「例外」です。 –

+0

@MorganThrapp、私は同意します。しかし、あなたが愚かな質問をしたら、あなたは愚かな答えを期待するべきです! –

関連する問題