2016-10-26 1 views
-2

私は先週尋ねたその1つのに似た質問があります: "Sorting dict items by key, beyond alphanumeric sorting"、アドホック機能

問題は同じであるが、今の私の辞書のキーは単に整数です:

私は「key_func」パドレイクCunnを再利用しようとしてい

[(2, 316), 
(3, 66), 
(4, 37), 
(5, 15), 
(6, 10), 
(7, 4), 
(8, 3), 
(9, 1), 
(10, 2), 
(11, 1), 
(12, 1), 
(16, 1), 
(45, 1), 
(109, 1), 
(126, 1)] 

:あなたは、私はタプルのこの順序付きリストを探してるの推測を持っているでしょうとして

>>>lis_nodiz = list(nodiz.items()) #list of dict items as tuples 
[(2, 316), 
(3, 66), 
(4, 37), 
(5, 15), 
(6, 10), 
(7, 4), 
(8, 3), 
(9, 1), 
(10, 2), 
(11, 1), 
(12, 1), 
(45, 1), 
(109, 1), 
(16, 1), 
(126, 1)] 

インガムが私を提案し、残念ながらこの機能は、文字列型のみの辞書キーで動作するようです:

def key_func(x): 
"""'a0p12' -> (0, 12)""" 
return tuple(int("".join(v)) for k,v in groupby(x[0], key=str.isdigit) if k) 

>>>lis_nodiz_od = sorted(nodiz.items(), key=key_func) 
TypeError: expected string or buffer 
機能を変更する方法

、またはどのように私は私の目的を得るための別の方法で行うことができますか? 誰かが "key_func"が実際にどのように動作し、整数で動作させるために正しい修正が行われたかを説明していただければ幸いです。この方法で、私はPythonプログラミングの詳細を理解し、今日の私の問題を解決するだけでなく、 ありがとうございました!

+0

前;とにかく、key_funcに関する質問の部分はオリジナルであり、以前は尋ねられていないようです。だから決定的には私の質問は完全に尋ねられておらず、あなたには前に答えていた! –

答えて

2

コールsorted()またはlist.sort()など:lis_nodizは質問で述べたように、タプルのリストがある

# sorted(): Creates new list with sorted order 
>>> sorted(lis_nodiz) 
[(2, 316), (3, 66), (4, 37), (5, 15), (6, 10), (7, 4), (8, 3), (9, 1), (10, 2), (11, 1), (12, 1), (16, 1), (45, 1), (109, 1), (126, 1)] 

# list.sort(): sort the existing list 
>>> lis_nodiz.sort() 
>>> lis_nodiz 
[(2, 316), (3, 66), (4, 37), (5, 15), (6, 10), (7, 4), (8, 3), (9, 1), (10, 2), (11, 1), (12, 1), (16, 1), (45, 1), (109, 1), (126, 1)] 

注:ここではkeyを指定する必要はありません。デフォルトでは、0番目の索引で辞書順ソートを行います。同じ値の場合は、1番目のインデックスをソートします。

+2

key関数は、ソートを2番目の要素で安定させたい場合にのみ必要であることに注意してください。タプルはすでに要素を左から右へ辞書編集的に分類しています。また、 'operator.itemgetter(0)'はユーザ定義関数よりも効率的でなければなりません。 – chepner

+0

@chepner:貴重な情報をありがとう –

+1

よろしくお願いします。説明と回答の両方に感謝します! –

0

最初のキーでラムダでソートする必要はありません。これはタプルのデフォルトです。

>>> sorted(x) 
[(2, 316), (3, 66), (4, 37), (5, 15), (6, 10), (7, 4), (8, 3), (9, 1), (10, 2), (11, 1), (12, 1), (16, 1), (45, 1), (109, 1), (126, 1)] 

それが自動的にソート最初のメンバーに、彼らは第二の部材でソートされます等しい場合、この質問のまま、私は質問がされていた知っているため、防衛としてなど

関連する問題