2

これは辞書です:

lettersandnumbers = {'Z': 1, 'Y': 0, 'X': 1, 'W': 17, 'V': 4, 'U': 0,\
 'T': 22, 'S': 21, 'R': 31, 'Q': 0, 'P': 12, 'O': 8,\
 'N': 10, 'M': 29, 'L': 27, 'K': 14, 'J': 51, 'I': 7,\
 'H': 14, 'G': 21, 'F': 12, 'E': 27, 'D': 40, 'C': 43,\
 'B': 28, 'A': 34}

アルファベット順に並べたい。並べ替え機能が使えるようにリストにしてみましたが、完全に迷っています。何か案は?

4

5 に答える 5

3

反復を行うにはいくつかの方法があります。上記のリンクは、一度使用するために辞書をソートする方法を説明しています。Python 2.7 および 3.x 以降で永続的な順序付き辞書が必要な場合は、 OrderedDictコレクションを使用できます。以下の例を参照してください。

>>> from collections import OrderedDict
# Random dictionary
>>> foo = {'a': 1, 'b':2, 'e':4, 'd':6, 'f': 7}
>>> foo
{'a': 1, 'b':2, 'e':4, 'd':6, 'f': 7}
# OrderedDict remember order of insert, hence to maintain a sorted
# dictionary entry, we must supplies a sorted tuple the example below
# sorted by entry key
>>> bar = OrderedDict(sorted(foo.items(), key=lambda t: t[0]))
>>> bar
OrderedDict([('a', 1), ('b', 2), ('d', 6), ('e', 4), ('f', 7)])

表記の違いにもかかわらず、barオブジェクトの機能は辞書と同じです。

于 2013-04-11T02:55:07.497 に答える
2

ディクショナリは単なるコンテナです。ソートされた順序でキーを反復処理する場合は、「Python では、ソートされた順序で辞書を反復処理するにはどうすればよいですか? 」を参照してください。

于 2013-04-11T02:36:30.507 に答える
0

@Nerolynx は、彼の方法のこの単純で高速なバージョンの使用を拒否しているため、

>>> from collections import OrderedDict
>>> d = {'Z': 1, 'Y': 0, 'X': 1, 'W': 17, 'V': 4, 'U': 0, 'T': 22, 'S': 21, 'R': 31, 'Q': 0, 'P': 12, 'O': 8,'N': 10, 'M': 29, 'L': 27, 'K': 14, 'J': 51, 'I': 7,      'H': 14, 'G': 21, 'F': 12, 'E': 27, 'D': 40, 'C': 43, 'B': 28, 'A': 34}
>>> OrderedDict(sorted(d.items()))
OrderedDict([('A', 34), ('B', 28), ('C', 43), ('D', 40), ('E', 27), ('F', 12), ('G', 21), ('H', 14), ('I', 7), ('J', 51), ('K', 14), ('L', 27), ('M', 29), ('N', 10), ('O', 8), ('P', 12), ('Q', 0), ('R', 31), ('S', 21), ('T', 22), ('U', 0), ('V', 4), ('W', 17), ('X', 1), ('Y', 0), ('Z', 1)])
于 2013-04-11T04:25:49.610 に答える
0

を使用する[some dict].items()と、タプルのリストが生成されます。

>>> d={3:'three',35:'thirty five',100:'one hindred'}
>>> d
{35: 'thirty five', 3: 'three', 100: 'one hindred'}
>>> d.items()
[(35, 'thirty five'), (3, 'three'), (100, 'one hindred')]

タプルは Python でソート可能です:

>>> sorted(d.items())
[(3, 'three'), (35, 'thirty five'), (100, 'one hindred')]

したがって、辞書は Python のデフォルトのソート順で希望どおりにソートされます。

>>> lettersandnumbers = {'Z': 1, 'Y': 0, 'X': 1, 'W': 17, 'V': 4, 'U': 0,'T': 22, 'S': 21, 'R': 31, 'Q': 0, 'P': 12, 'O': 8,'N': 10, 'M': 29, 'L': 27, 'K': 14, 'J': 51, 'I': 7,'H': 14, 'G': 21, 'F': 12, 'E': 27, 'D': 40, 'C': 43,'B': 28, 'A': 34}
>>> sorted(lettersandnumbers.items())
[('A', 34), ('B', 28), ('C', 43), ('D', 40), ('E', 27), ('F', 12), ('G', 21), ('H', 14), ('I', 7), ('J', 51), ('K', 14), ('L', 27), ('M', 29), ('N', 10), ('O', 8), ('P', 12), ('Q', 0), ('R', 31), ('S', 21), ('T', 22), ('U', 0), ('V', 4), ('W', 17), ('X', 1), ('Y', 0), ('Z', 1)]

(必要な順序がデフォルトと異なる場合は、sorted のkeyパラメーターを使用する必要がある場合があります。その場合、デフォルトが機能します。)

次に、この順序を維持する dict が必要な場合:

>>> from collections import OrderedDict
>>> od=OrderedDict(sorted(lettersandnumbers.items()))
>>> od.items()[0]
('A', 34)
>>> od.items()[-1]
('Z', 1)

ただし、順序付き辞書は挿入順序に基づいているため、並べ替え順序にないものを追加すると、並べ替えられません。

さらに良いことに、辞書の不必要なコピーを作成することを避け、必要に応じて現在の並べ替え順序で辞書を反復処理します。

for k,v in sorted(d.items()): 
    # deal with the key and value in sorted order at that moment...

Python 2 では、d.iteritems() を使用する必要があります。そうしないと、2 つの一時リストが作成されます。1 つはアイテム用、もう 1 つはソート用です。Py 3 (または Py 2 と d.iteritems() メソッド) では、ソート用に 1 つの一時リストのみが生成されます。

于 2013-04-11T04:46:26.693 に答える
0
>>> from collections import OrderedDict
>>> from string import ascii_uppercase as alphabet
>>> d = {'Z': 1, 'Y': 0, 'X': 1, 'W': 17, 'V': 4, 'U': 0, 'T': 22, 'S': 21, 'R': 31, 'Q': 0, 'P': 12, 'O': 8,'N': 10, 'M': 29, 'L': 27, 'K': 14, 'J': 51, 'I': 7,      'H': 14, 'G': 21, 'F': 12, 'E': 27, 'D': 40, 'C': 43, 'B': 28, 'A': 34}
>>> OrderedDict((k, d[k]) for k in alphabet if k in d)
OrderedDict([('A', 34), ('B', 28), ('C', 43), ('D', 40), ('E', 27), ('F', 12), ('G', 21), ('H', 14), ('I', 7), ('J', 51), ('K', 14), ('L', 27), ('M', 29), ('N', 10), ('O', 8), ('P', 12), ('Q', 0), ('R', 31), ('S', 21), ('T', 22), ('U', 0), ('V', 4), ('W', 17), ('X', 1), ('Y', 0), ('Z', 1)])
于 2013-04-11T04:45:48.060 に答える