5

だから、私はPythonを学ぼうとしているPHPプログラマーです。私はソートしたい辞書の辞書を持っています。それらを OrderedDict に変えました。それらは完全にソートされます。元の辞書は次のようになります。これはただの 3 次元配列ですよね?

a["01/01/2001"]["un"]=1
a["01/01/2001"]["nn"]=1
a["01/02/2001"]["aa"]=2
a["01/02/2001"]["bb"]=2
a["01/03/2001"]["zz"]=3
a["01/03/2001"]["rr"]=3

それらを OrderedDict に変換でき、次の形式で表示したい

"01/01/2001" un=1 nn=1
"01/02/2001" aa=2 bb=2
"01/03/2001" zz=3 rr=3

この連想配列を通過する単純なループをphpで書くことはできますが、pythonでそれを行う方法がわかりません。誰か助けてくれませんか?

4

3 に答える 3

5

dict.items()またはdict.iteritems()メソッドを使用してキーと値をループします。後者を使用すると、キーと値のペアの中間リストを作成せずに反復できます。

for date, data in a.iteritems():
    print date,
    for key, value in data.iteritems():
        print '{}={}'.format(key, value),
    print

辞書を直接ループすると、代わりにキーが得られます。サブスクリプションを使用して、引き続き値にアクセスできます。

for date in a:
    print date,
    for key in a[date]:
        print '{}={}'.format(key, a[date][key]),
    print
于 2013-09-25T16:25:12.267 に答える
2

OrderedDict ではなく、defaultdict を使用したほうがよいと思います。

from collections import defaultdict

a = defaultdict(dict)
a["01/03/2001"]["zz"]=3
a["01/01/2001"]["un"]=1
a["01/02/2001"]["aa"]=2
a["01/01/2001"]["nn"]=1
a["01/02/2001"]["bb"]=2
a["01/03/2001"]["rr"]=3

# a is now a dict of dicts, each key is a date and each value is a dict of all 
# subkey-values

# print out in date order
for k,v in sorted(a.items()):
    # for each subdict, print key=value in sorted key order
    print k, ' '.join("%s=%s" % (kk,vv) for kk,vv in sorted(v.items()))

版画:

01/01/2001 nn=1 un=1
01/02/2001 aa=2 bb=2
01/03/2001 rr=3 zz=3

編集:

ああ!悪いことに、k=v の値を挿入順に表示したいので、OrderedDict の defaultdict が必要です。

from collections import defaultdict, OrderedDict

a = defaultdict(OrderedDict)
a["01/01/2001"]["un"]=1
a["01/01/2001"]["nn"]=1
a["01/02/2001"]["aa"]=2
a["01/02/2001"]["bb"]=2
a["01/03/2001"]["zz"]=3
a["01/03/2001"]["rr"]=3

# print out in date order
for k,v in sorted(a.items()):
    # for each subdict, print key=value in as-inserted key order, so no sort requred
    print k, ' '.join("%s=%s" % (kk,vv) for kk,vv in v.items())

版画:

01/01/2001 un=1 nn=1
01/02/2001 aa=2 bb=2
01/03/2001 zz=3 rr=3
于 2013-09-25T17:42:23.180 に答える