web-dev-qa-db-ja.com

辞書をキーで並べ替えるにはどうすればよいですか。

{2:3, 1:89, 4:5, 3:0}から{1:89, 2:3, 3:0, 4:5}へ移動するための良い方法は何でしょうか?
私はいくつかの投稿をチェックしましたが、それらはすべてタプルを返す "sorted"演算子を使用しています。

754
achrysochoou

標準のPython辞書は順不同です。 (key、value)のペアをソートしたとしても、順序を維持するような方法でそれらをdictに格納することはできません。

最も簡単な方法は OrderedDict を使うことです。これは要素が挿入された順番を覚えています:

In [1]: import collections

In [2]: d = {2:3, 1:89, 4:5, 3:0}

In [3]: od = collections.OrderedDict(sorted(d.items()))

In [4]: od
Out[4]: OrderedDict([(1, 89), (2, 3), (3, 0), (4, 5)])

odの印刷方法は気にしないでください。期待通りに動作します。

In [11]: od[1]
Out[11]: 89

In [12]: od[3]
Out[12]: 0

In [13]: for k, v in od.iteritems(): print k, v
   ....: 
1 89
2 3
3 0
4 5

Python 3

Python 3ユーザーの場合、.items()の代わりに.iteritems()を使う必要があります。

In [13]: for k, v in od.items(): print(k, v)
   ....: 
1 89
2 3
3 0
4 5
774
NPE

辞書自体は項目をそのように順序付けしていません。あなたがそれらを何らかの順序でそれらを印刷したいのであれば、ここにいくつかの例があります:

Python 2.4以降の場合:

mydict = {'carl':40,
          'alan':2,
          'bob':1,
          'danny':3}

for key in sorted(mydict):
    print "%s: %s" % (key, mydict[key])

を与えます:

alan: 2
bob: 1
carl: 40
danny: 3

(2.4より下のPython :)

keylist = mydict.keys()
keylist.sort()
for key in keylist:
    print "%s: %s" % (key, mydict[key])

ソース: http://www.saltycrane.com/blog/2007/09/how-to-sort-python-dictionary-by-keys/

368
James

From Pythonのcollectionsライブラリドキュメント

>>> from collections import OrderedDict

>>> # regular unsorted dictionary
>>> d = {'banana': 3, 'Apple':4, 'pear': 1, 'orange': 2}

>>> # dictionary sorted by key -- OrderedDict(sorted(d.items()) also works
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('Apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

>>> # dictionary sorted by value
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('Apple', 4)])

>>> # dictionary sorted by length of the key string
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('pear', 1), ('Apple', 4), ('orange', 2), ('banana', 3)])
179
Dennis

Python3.6以降では、これは簡単にできます:

>>> d = {2:3, 1:89, 4:5, 3:0}
>>> dict(sorted(d.items()))
{1: 89, 2: 3, 3: 0, 4: 5}
50
Dipu

ソートされた順序で自動的にキーを管理する辞書の実装を提供するPythonモジュールがいくつかあります。純粋なPythonおよびC言語としての高速実装である sortedcontainers モジュールを考えてみましょう。 パフォーマンス比較 お互いに対してベンチマークされた他の一般的なオプションとの/もあります。

キーと値のペアを常に追加および削除しながら繰り返しを行う必要がある場合は、順序付き辞書の使用は不適切な解決策です。

>>> from sortedcontainers import SortedDict
>>> d = {2:3, 1:89, 4:5, 3:0}
>>> s = SortedDict(d)
>>> s.items()
[(1, 89), (2, 3), (3, 0), (4, 5)]

SortedDict型はインデックス付きの位置検索と削除もサポートしていますが、これは組み込みの辞書型では不可能です。

>>> s.iloc[-1]
4
>>> del s.iloc[2]
>>> s.keys()
SortedSet([1, 2, 4])
37
GrantJ

単に:

d = {2:3, 1:89, 4:5, 3:0}
sd = sorted(d.items())

for k,v in sd:
    print k, v

出力:

1 89
2 3
3 0
4 5
24
user3769249

他の人が述べたように、辞書は本質的に無秩序です。ただし、問題が単に辞書を順番に表示するだけの場合は、辞書サブクラスで__str__メソッドをオーバーライドして、組み込みのdictではなくこの辞書クラスを使用できます。例えば。

class SortedDisplayDict(dict):
   def __str__(self):
       return "{" + ", ".join("%r: %r" % (key, self[key]) for key in sorted(self)) + "}"


>>> d = SortedDisplayDict({2:3, 1:89, 4:5, 3:0})
>>> d
{1: 89, 2: 3, 3: 0, 4: 5}

注意して欲しいのは、これはキーがどのように格納されているか、それらを反復したときに戻ってくる順番などについては何も変更せず、printやpythonコンソールでの表示方法だけです。

23
Brian

別の方法を見つけました:

import json
print json.dumps(d, sort_keys = True)

更新日:
1。これは入れ子になったオブジェクトもソートします(ありがとう@DanielF)。
2。 python辞書は順序付けられていないので、これは印刷に適しているか、strにのみ割り当てられます。

15
tschesseket

Python 3では。 

>>> D1 = {2:3, 1:89, 4:5, 3:0}
>>> for key in sorted(D1):
    print (key, D1[key])

与える

1 89
2 3
3 0
4 5
14

ここで私はpprint。を使ってPythonの辞書をキーでソートするための最も簡単な解決策を見つけました。 

>>> x = {'a': 10, 'cd': 20, 'b': 30, 'az': 99} 
>>> print x
{'a': 10, 'b': 30, 'az': 99, 'cd': 20}

しかしpprintを使用している間それはソートされた辞書を返すでしょう

>>> import pprint 
>>> pprint.pprint(x)
{'a': 10, 'az': 99, 'b': 30, 'cd': 20}
10
Atul Arvind

Python 3.6より前のPython辞書は順不同でした。 Python 3.6のCPython実装では、dictionaryは挿入順序を保持します。 Python 3.7から、これは言語機能になります。

サブ辞書を含めて入れ子になった辞書を並べ替える場合は、次のようにします。

test_dict = {'a': 1, 'c': 3, 'b': {'b2': 2, 'b1': 1}}

def dict_reorder(item):
    return {k: sort_dict(v) if isinstance(v, dict) else v for k, v in sorted(item.items())}

reordered_dict = dict_reorder(test_dict)

https://Gist.github.com/ligyxy/f60f0374defc383aa098d44cfbd318eb

7
Guangyang Li

辞書をソートする簡単な方法があります。

あなたの質問によると、

解決策は次のとおりです。

c={2:3, 1:89, 4:5, 3:0}
y=sorted(c.items())
print y

(ここで、cはあなたの辞書の名前です。)

このプログラムは次のような出力をします。

[(1, 89), (2, 3), (3, 0), (4, 5)]

あなたが欲しかったように。

別の例は次のとおりです。

d={"John":36,"Lucy":24,"Albert":32,"Peter":18,"Bill":41}
x=sorted(d.keys())
print x

出力が得られます:['Albert', 'Bill', 'John', 'Lucy', 'Peter']

y=sorted(d.values())
print y

出力が得られます:[18, 24, 32, 36, 41]

z=sorted(d.items())
print z

出力を与えます:

[('Albert', 32), ('Bill', 41), ('John', 36), ('Lucy', 24), ('Peter', 18)]

したがって、それをキー、値、および項目に変更することによって、あなたはuが欲しいもののように印刷することができます。

6
Sree

あなたが望むものを正確に生成します。 

 D1 = {2:3, 1:89, 4:5, 3:0}

 sort_dic = {}

 for i in sorted(D1):
     sort_dic.update({i:D1[i]})
 print sort_dic


{1: 89, 2: 3, 3: 0, 4: 5}

しかし、これはこれを行うための書き込み方法ではありません。なぜなら、私が最近学んだことです。それで、完璧な方法は私がここで共有している私の質問の応答でティムによって提案されました。

from collections import OrderedDict
sorted_dict = OrderedDict(sorted(D1.items(), key=lambda t: t[0]))
5
jax

あなたの質問に従って現在の辞書をキーでソートすることで新しい辞書を作ることができます。

これはあなたの辞書です

d = {2:3, 1:89, 4:5, 3:0}

ラムダ関数を使用してこのdをソートして、新しい辞書d1を作成します。

d1 = dict(sorted(d.items(), key = lambda x:x[0]))

d1は{1:89、2:3、3:0、4:5}でなければならず、dのキーに基づいてソートされます。

4
Amit Prafulla

Python辞書は順不同です。通常、これは問題ではありません。最も一般的な使用例はルックアップを行うことです。 

最も簡単な方法は、要素をソート順に挿入してcollections.OrderedDictを作成することです。

ordered_dict = collections.OrderedDict([(k, d[k]) for k in sorted(d.keys())])

上記のように反復する必要がある場合、最も簡単な方法はソートされたキーを反復することです。例 -

キーでソートされた値を印刷します。

# create the dict
d = {k1:v1, k2:v2,...}
# iterate by keys in sorted order
for k in sorted(d.keys()):
    value = d[k]
    # do something with k, value like print
    print k, value

キーでソートされた値の一覧を取得します。

values = [d[k] for k in sorted(d.keys())]
4

一番簡単なのは、辞書をキーでソートし、ソートしたキーと値のペアを新しい辞書に保存することです。

dict1 = {'renault': 3, 'ford':4, 'volvo': 1, 'toyota': 2} 
dict2 = {}                  # create an empty dict to store the sorted values
for key in sorted(dict1.keys()):
    if not key in dict2:    # Depending on the goal, this line may not be neccessary
        dict2[key] = dict1[key]

明確にするために:

dict1 = {'renault': 3, 'ford':4, 'volvo': 1, 'toyota': 2} 
dict2 = {}                  # create an empty dict to store the sorted     values
for key in sorted(dict1.keys()):
    if not key in dict2:    # Depending on the goal, this line may not be  neccessary
        value = dict1[key]
        dict2[key] = value
4
lallolu

私は単一行の辞書のソートを思いついた 

>> a = {2:3, 1:89, 4:5, 3:0}
>> c = {i:a[i] for i in dict.fromkeys(sorted([i for i in a]))}
>> print(c)
{1: 89, 2: 3, 3: 0, 4: 5}
[Finished in 0.4s]

これが役立つことを願っています。 

1

最も簡単な解決策は、辞書キーのリストをソート順にしてから辞書を反復処理することです。例えば

a1 = {'a':1, 'b':13, 'd':4, 'c':2, 'e':30}
a1_sorted_keys = sorted(a1, key=a1.get, reverse=True)
for r in a1_sorted_keys:
    print r, a1[r]

以下が出力されます(降順)。

e 30
b 13
d 4
c 2
a 1
0
Shafiq

2.7の2つの方法のタイミング比較は、それらが実質的に同一であることを示します。

>>> setup_string = "a = sorted(dict({2:3, 1:89, 4:5, 3:0}).items())"
>>> timeit.timeit(stmt="[(k, val) for k, val in a]", setup=setup_string, number=10000)
0.003599141953657181

>>> setup_string = "from collections import OrderedDict\n"
>>> setup_string += "a = OrderedDict({1:89, 2:3, 3:0, 4:5})\n"
>>> setup_string += "b = a.items()"
>>> timeit.timeit(stmt="[(k, val) for k, val in b]", setup=setup_string, number=10000)
0.003581275490432745 
0
Jesuisme

みんなあなたが物事を複雑にしています...それは本当に簡単です

from pprint import pprint
Dict={'B':1,'A':2,'C':3}
pprint(Dict)

出力は以下のとおりです。

{'A':2,'B':1,'C':3}
0
Derick Fdo

あるいはpandasを使ってください。

デモ:

>>> d={'B':1,'A':2,'C':3}
>>> df=pd.DataFrame(d,index=[0]).sort_index(axis=1)
   A  B  C
0  2  1  3
>>> df.to_dict('int')[0]
{'A': 2, 'B': 1, 'C': 3}
>>> 

見る:

このドキュメント

パンダ全体のドキュメンテーション

0
U9-Forward
dictionary = {1:[2],2:[],5:[4,5],4:[5],3:[1]}

temp=sorted(dictionary)
sorted_dict = dict([(k,dictionary[k]) for i,k in enumerate(temp)])

sorted_dict:
         {1: [2], 2: [], 3: [1], 4: [5], 5: [4, 5]}
0
Mahdi Ghelichi

別のPythonicアプローチは

def sort_dict(my_dict):
    return sorted(my_dict.items(), key=lambda x :x[1])


0
E. Dogan
from operator import itemgetter
# if you would like to play with multiple dictionaries then here you go:
# Three dictionaries that are composed of first name and last name.
user = [
    {'fname': 'Mo', 'lname': 'Mahjoub'},
    {'fname': 'Abdo', 'lname': 'Al-hebashi'},
    {'fname': 'ALi', 'lname': 'Muhammad'}
]
#  This loop will sort by the first and the last names.
# notice that in a dictionary order doesn't matter. So it could put the first name first or the last name first. 
for k in sorted (user, key=itemgetter ('fname', 'lname')):
    print (k)

# This one will sort by the first name only.
for x in sorted (user, key=itemgetter ('fname')):
    print (x)
0