2016-04-28 13 views
1

​​要素を最後に追加するのではなく、要素を挿入することを避けるにはどうすればよいですか?

、なぜこの出来事はありますか?

d_names 
d_new_names 

第二は、最初の再注文したバージョンです:

は、私は2つの辞書を持っています。これは私がI cannot re-order an existing OrderedDict - I need to create a new oneを理解しているからです。

l_new_names = [] 
for s_number in d_names: 
    for s_week_number in d_names[s_number]: 
     l_new_names.append([s_number, s_week_number]) 

print "l_new_names before sort = %s" % l_new_names 
l_new_names.sort() 
print "l_new_names after sort = %s" % l_new_names 

その後、私が作成し、新しい辞書の最初のレベルを入力します:

d_new_names = ordereddict.OrderedDict() 

for s_number, _ in l_new_names: 
    if s_number in d_new_names: 
     print "NOT creating d_new_names[%s]" % s_number 
    else: 
     print "creating d_new_names[%s]" % s_number 
     d_new_names[s_number] = {} 
     d_new_names[s_number][NAME] = d_names[s_number][NAME] 

その後、私は2番目のレベルを作成し、塗りつぶし、私は最初の順序付きリストを作成します。これを行うに

辞書:

for s_number, s_week_number in l_new_names: 
    d_new_names[s_number][s_week_number] = {} 
    d_new_names[s_number][s_week_number][DATE] = d_names[s_number][s_week_number][DATE] 
    d_new_names[s_number][s_week_number][PRICE] = d_names[s_number][s_week_number][PRICE] 

辞書の内容をファイルに書き込んだとき、私はこのことに驚きました順序:

writing week:13 
writing week:15 
writing week:14 
writing week:16 

週15私はこの(数はループに対応する)を求める(ループを通してOrderedDictたび印刷)調査時に週14

の前に、ある:

  1. 週13を追加;注文:13
  2. 14週追加;注文:13,14
  3. 15週追加;注文:13,,14
  4. 16週追加;順序:13、15、14、16

結論:OrderedDictに作成および構成要素の挿入時に、要素が間違った順序で挿入されています。私はそれが可能だとは思わなかった。

誰でも何が起こっているのか、どのように解決するのか説明できますか?

+0

コードを実行するサンプルデータを投稿してください。このコードは、問題を再現するのに最小限ではありません。 – MohitC

+0

他の何かが間違っています。順序付けされた辞書は元の挿入順序を非常に維持します。 –

答えて

3

あなたが定期的に辞書ではなく、注文した辞書に週番号を挿入されていますs_number値は、挿入順に保たれますが、キーは通常の辞書を参照しているので、注文した辞書で

d_new_names[s_number] = {} 
ここ

d_new_names

d_new_names[s_number][s_week_number] = {} 

があなたのs_week_number週番号は、このように挿入順に保管されていないが、代わりに通常の辞書の任意の順序に従います。

その後、後でごとの週の情報を保存するために、それらの通常の辞書を使用しています。

+0

それだけです! 'd_new_names [s_po_number] = ordereddict.OrderedDict()'と 'd_new_names [s_po_number] [s_week_number] = ordereddict.OrderedDict()'という2行を変更しました。 (質問から解決までの6分 - 私は自分の質問の1つで見たことがありました!))[私はこれを自分で見つけられませんでした。] – Wikis

+1

@Wikis 3にしました、私は確信しています。 :-) –

関連する問題