1

順序付けられた辞書を最後から順に繰り返し処理しようとしています。標準辞書の場合はすべて正常に機能しますが、orderedDict の最初のソリューションは奇妙な反応を示します。popitem()1つのキーと値のペアを返している間(ただしkv_pair、2つの変数で置き換えることができないため、どういうわけか順番に)、反復は終了しているようです。次のキーと値のペアに進む簡単な方法がわかりません。

2 つの有効な代替手段 (以下を参照) を見つけましたが、どちらも通常の辞書アプローチの優雅さに欠けています。

オンライン ヘルプで見つけた情報から判断することはできませんが、私の予想は間違っていると思います。もっとエレガントなアプローチはありますか?

from collections import OrderedDict

normaldict = {"0": "a0.csf", "1":"b1.csf", "2":"c2.csf"}

for k, v in normaldict.iteritems():
    print k,":",v

d = OrderedDict()
d["0"] = "a0.csf"
d["1"] = "b1.csf"
d["2"] = "c2.csf"

print d, "****"

for kv_pair in d.popitem():
    print kv_pair
print "++++"


for k in reversed(d.keys()):
    print k, d[k]

print "%%%%"

while len(d) > 0:
    k, v = d.popitem()
    print k, v
4

2 に答える 2

2

dict.popitem()と同じではありませんdict.iteritems()辞書から1 つのペアをタプルとして削除し、そのペアをループしています。

最も効率的な方法は、while代わりにループを使用することです。を呼び出す必要はありませんlen()。辞書自体に対してテストするだけです。空の辞書は false と見なされます。

while d:
    key, value = d.popitem()
    print key, value

別の方法は、次を使用することreversed()です。

for key, item in reversed(d.items()):
    print key, value

ただし、最初に辞書全体をリストにコピーする必要があります。

ただし、FIFO キューを探していた場合は、collections.deque()代わりに次を使用します。

from collections import deque

d = deque(["a0.csf", "b1.csf", "c2.csf"])

while d:
    item = d.pop()

または使用しますdeque.reverse()

于 2013-08-13T08:00:12.377 に答える