2016-07-26 10 views
0

私は2つの辞書のリストを持っていると仮定値:ループ辞書のリスト上に、リスト内

iter_list = [{0: [2, 1, 3], 
       1: [3, 2, 1], 
       2: [1, 2, 3], 
       3: [2, 3, 1], 
       4: [1, 2, 3], 
       5: [2, 3, 1]}, 
      {0: [2, 3, 1], 
       1: [1, 2, 3], 
       2: [1, 2, 3], 
       3: [1, 2, 3], 
       4: [2, 3, 1], 
       5: [1, 3, 2]}] 

各辞書は、6つのキーは5 0〜番号たIは、Aにおける各辞書1をループしたいです(キー値によって順序づけられた)キーと対応するリストの最初の値とのペアになり、第1の値は第2のキー等に対応し、その後にキーと第2の値が続くうまくいけば、出力の例が明らかになるでしょう。

0 2 
1 3 
2 1 
3 2 
4 1 
5 2 
0 1 
1 2 
2 2 
3 3 
4 2 
5 3 
0 3 
1 1 
2 3 
3 1 
4 3 
5 1 
0 2 //2nd dictionary iteration 
1 1 
2 1 
3 1 
4 2 
5 1 
0 3 
1 2 
2 2 
3 2 
4 3 
5 3 
0 1 
1 3 
2 3 
3 3 
4 1 
5 2 

私は最初のディクショナリの最初の位置をどのようにループするか分かりましたが、[0]を反復変数として使用して値リスト内のすべての位置を調べる方法を理解することはできません次の辞書に移動します。

for i in iter_list: 
    for key, value in i.iteritems(): 
      print key, value[0] 

ご協力いただきありがとうございます。ありがとう!

+0

なぜ3,1,2で終了しないのですか? –

+1

この例は、常に同じ数よりもむしろユニークな値を使用するとはるかに明確になります。それは大きなものにする必要がありますか? –

+0

@StefanPochmann私は、元々のものよりもずっと短くしましたが、リストの長さを2、辞書の番号を2にしたくないので、新しい繰り返しがどこから始まったのか分かりません。私が扱っていた例は順列を使っていたので、私は一意の値を使わなかったのですが、間違いなく良い点です!フィードバックをお寄せいただきありがとうございます! – Shayna

答えて

4

私が正しくあなたを理解していれば、あなたのケースでは、あなたがiter_list 3回

>>> for i in iter_list: 
...  for x in range(3): 
...   for key, value in i.iteritems(): 
...    print key, value[x] 
... 

出力反復処理する必要があります。

0 2 
1 3 
2 1 
3 2 
4 1 
5 2 
0 1 
1 2 
2 2 
3 3 
4 2 
5 3 
0 3 
1 1 
2 3 
3 1 
4 3 
5 1 
0 2 
1 1 
2 1 
3 1 
4 2 
5 1 
0 3 
1 2 
2 2 
3 2 
4 3 
5 3 
0 1 
1 3 
2 3 
3 3 
4 1 
5 2 
+0

こんにちは、お返事ありがとうございました!実際には、辞書ごとに1つずつ、繰り返しが2回しかありません。私たちの数字はkey = 0の2番目のラウンドで発散し、私は(0,1)を持ち、(0,2)を持っています。これは、最初の辞書を完全に通過してから2番目のループをループし、各ループの位置を移動したいからです。 – Shayna

+0

@HaifengZhang:最初の2つのループを交換すると、おそらく正しいでしょう。 – SuperSaiyan

+0

@Shayna swap 'for range(3):'と 'iter_listのi: – haifzhan

1

リストの内包が行う必要があります。

>>> output_list = [[k, d[k][i]] for d in iter_list for i in range(3) for k in sorted(d)]: 
>>> for k, dki in output_list: 
...  print k, dki 
... 
0 2 
1 3 
2 1 
3 2 
4 1 
5 2 
0 1 
1 2 
2 2 
3 3 
4 2 
5 3 
0 3 
1 1 
2 3 
3 1 
4 3 
5 1 
0 2 
1 1 
2 1 
3 1 
4 2 
5 1 
0 3 
1 2 
2 2 
3 2 
4 3 
5 3 
0 1 
1 3 
2 3 
3 3 
4 1 
5 2 
1

おそらくこれを行うには:

for i in iter_list: 
    for j in range(3): 
     for key, value in i.iteritems(): 
      print key, value[j] 

辞書の値が3の固定長であると仮定すると、そうでない場合は、3がどこから来るのか把握する必要があります。 例えば、それはすべての辞書のすべての値を横切る最小値の長さとすることができる:

>>> min(len(v) for k,v in i.iteritems() for i in iter_list) 
3 
2

異なるzipitertools.chainを用いたアプローチとunpackingトリック:

from itertools import chain 
packed_pairs = zip(*[[(k, v) for v in vs] for ds in iter_list for k, vs in ds.items()]) 
pairs = chain(*packed_pairs) 
for pair in pairs: 
    print pair[0], pair[1] 

出力:

0 2 
1 3 
2 1 
3 2 
4 1 
5 2 
0 2 
1 1 
2 1 
3 1 
4 2 
5 1 
0 1 
1 2 
2 2 
3 3 
4 2 
5 3 
0 3 
1 2 
2 2 
3 2 
4 3 
5 3 
0 3 
1 1 
2 3 
3 1 
4 3 
5 1 
0 1 
1 3 
2 3 
3 3 
4 1 
5 2 

注:pairsを再利用する場合は、pairs = list(pairs)を必ず使用してください。