2017-02-12 4 views
2
clip = [('b', 12), ('e', 10),('d', 11),('a',12),('c', 10),('g',18)] 

このリストでは、最も番号の大きい文字を最初に昇順に印刷する必要があります。今では、2つの文字が同じ数字を持っている場合、最初に来る文字は英語のアルファベットで最初に、次のものはそれに応じて印刷する必要があります。どうやってやるの? この上記のリストは、次のように印刷する必要があります。タプルの数字が等しい場合にのみ、このリストのタプルをアルファベットに従って並べることはできますか?

clip = [('g',18),('a',12),('b',12),('d',11),('c',10),('e',10)] 

私は、私が知っているほとんどのソート方法が好きで試してみました:

sorted(clip.items(), key = lambda x:(x[0],x[1])) 
+2

タプルが辞書編集でソートされているため、 'key'は何もしません。 'key'関数でタプルの順序を逆にする –

答えて

2

Pythonのsorted()はその後数で、そのソートアルファベットによる最初、安定しています。

>>> clip = [('b', 12), ('e', 10),('d', 11),('a',12),('c', 10),('g',18)] 
>>> sorted(sorted(clip), key=lambda x:x[1], reverse=True) 
[('g', 18), ('a', 12), ('b', 12), ('d', 11), ('c', 10), ('e', 10)] 

はコメントでjuanpa.arrivillagaによると、これは、より効率的である:

>>> sorted(clip, key=lambda x:(-x[1], x[0])) 
[('g', 18), ('a', 12), ('b', 12), ('d', 11), ('c', 10), ('e', 10)] 

理解-x[1]といくつかの助け:

タプル、(a,b)a値を比較して、bを比較することにより、ソートされています2つの値が等しい場合は値が等しくなります。別段の指示がない限り、ソートは常に昇順に行われます。数字の束が[1,2,3]の場合、それらを逆順に並べ替えたい場合は、実際の値が* -1[-1,-2,-3]であることをPythonに伝えることができます。現在、それらをソートすると、最小から最大まで[-3,-2,-1]が得られます。数字を無効にするkey関数を渡すと、[1,2,3]の標準値として比較のために、負の数値[-1,-2,-3]が渡されています。ここでは、それを最初に手を学ぶためにPythonインタープリタに入力することができますいくつかのコマンドです:

key機能のためのリストを操作する方法を理解する
$ python3 
Python 3.5.2 (default, Nov 14 2016, 15:04:53) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> a = [(3,20), (1,40), (4,10), (2,30)] 

>>> [x[0] for x in a] 
[3, 1, 4, 2] 
>>> [x[1] for x in a] 
[20, 40, 10, 30] 
>>> [-x[0] for x in a] 
[-3, -1, -4, -2] 
>>> [(x[1],x[0]) for x in a] 
[(20, 3), (40, 1), (10, 4), (30, 2)] 

私たちはソートして上記学んだことを使って。並べ替えながら、キーの値が実際の値のためだけの一時的なスタンドであることを忘れないでください:

>>> sorted(a) 
[(1, 40), (2, 30), (3, 20), (4, 10)] 
>>> sorted(a, key=lambda x: -x[0]) 
[(4, 10), (3, 20), (2, 30), (1, 40)] 
>>> sorted([(x[1],x[0]) for x in a]) 
[(10, 4), (20, 3), (30, 2), (40, 1)] 
>>> sorted([(-x[1],x[0]) for x in a]) 
[(-40, 1), (-30, 2), (-20, 3), (-10, 4)] 

key機能が意味を行う必要はありません。これは常に0を返すため、リストは元の順序のままです。

>>> sorted(a, key=lambda x: 0) 
[(3, 20), (1, 40), (4, 10), (2, 30)] 

一つの最後のビットは、key=lambda x:(-x[1], x[0])トリックは否定することができます数字やもののために動作します。我々は再びあなたのリストをソートしようとしませんが、文字と昇順番号を降順にソートすることにより、逆に、-1トリックは、もはや機能している場合:

>>> clip = [('b', 12), ('e', 10),('d', 11),('a',12),('c', 10),('g',18)] 

まずフィールド、手紙を、逆に、その数字を順番に

>>> sorted(clip, key=lambda x: (-x[0], x[1])) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 1, in <lambda> 
TypeError: bad operand type for unary -: 'str' 

最初の並べ替え順

>>> sorted(clip, reverse=True) 
[('g', 18), ('e', 10), ('d', 11), ('c', 10), ('b', 12), ('a', 12)] 

である。

>>> sorted(sorted(clip, reverse=True), key=lambda x: x[1]) 
[('e', 10), ('c', 10), ('d', 11), ('b', 12), ('a', 12), ('g', 18)] 
+1

タプルを反転する' key'関数を渡すほうが効率的です。 –

+0

私は問題を解決しましたが、-x [1]は(-x [1]、x [0])で何をしますか?なぜ負のサインですか?それは何をするためのものか? –

+0

@JayJay、ソートを元に戻します。もしソートアルゴリズムが最小から最大にソートするならば、 '1,2,3 'は' -3、-2、-1'を否定することによって逆にすることができます。 – Harvey

関連する問題