2016-05-03 9 views
0

私は一度に2つの鍵を2つの鍵にループする必要があるプログラムに取り組んでいます。ここに私の辞書の簡単な表現があります。Python:ループ辞書、一度に2つの鍵

my_dict = { 
    'LAP0-1': 146.48, 
    'LAP1-1':44.11, 
    'LAP2-1':25.54, 
    'LAP3-1':75.29, 
    'LAP5-2':85.76, 
    'LAP6-2':46.87 
} 

# loop dictionary 1 key at a time 
for k,v in my_dict: 
    print k + " | " + v; 

私は私がリストを持っていた場合、私はそうのような時にはループのアイテム2を可能性を知っている:

for i in range(0, len(my_list), 2): 
    print my_list[i] + " | " + my_list[i+1]; 

しかし、時間のループ辞書の2つのキーをすることが可能ですか?

私はループの中で、次を印刷したい:私は考え

LAP0-1 | 146.48 ; LAP1-1 | 44.11 
LAP1-1 | 44.11 ; LAP2-1 | 25.54 
LAP2-1 | 75.29 ; LAP3-1 | 85.76 
LAP5-2 | 85.76 ; LAP6-2 | 46.87 

別の解決策が、私の場合のためにこれではありません:my_list[i]'LAP0-1'my_list[i+1]ある

for i in range(0, len(my_list), 2): 
    print my_dict[my_list[i]] + " | " my_dict[my_list[i+1]]; 

'LAP1-1'です。そのような2つのデータ構造を保管しておくことは、効率が悪いようです。一度に2つのキーをループさせるにはどうすればよいですか?

+0

にそのキーが定義されている順番を覚えていないし、あなたがそれを反復することができますOrderedDictすべてのk個の要素http://stackoverflow.com/questions/1403674/を提供しますピクトー・ウェイから戻ってリストの中のすべてのn番目のアイテムのリストを返す – Andres

+3

あなたは記入欄にあなたが記入した順序を覚えていますか? Dictsは意味的に順序付けられていません。それらはKey-Valueルックアップ構造です。それらを反復すると、あなたが書いた順序とは全く異なる順序が生まれるかもしれません。実際に必要なものが順序付けされたペアのシーケンスである場合、タプルのリストはしばしばより良いデータ構造です。 – user2357112

答えて

2
from collections import OrderedDict 
from itertools import tee 

my_dict = OrderedDict([ 
    ('LAP0-1', 146.48), 
    ('LAP1-1', 44.11), 
    ('LAP2-1', 25.54), 
    ('LAP3-1', 75.29), 
    ('LAP5-2', 85.76), 
    ('LAP6-2', 46.87) 
]) 

# pairwise() from Itertools Recipes 
def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return zip(a, b) 

for (key1, value1), (key2, value2) in pairwise(my_dict.items()): 
    print("{} | {} ; {} | {}".format(key1, value1, key2, value2)) 

OUTPUT

LAP0-1 | 146.48 ; LAP1-1 | 44.11 
LAP1-1 | 44.11 ; LAP2-1 | 25.54 
LAP2-1 | 25.54 ; LAP3-1 | 75.29 
LAP3-1 | 75.29 ; LAP5-2 | 85.76 
LAP5-2 | 85.76 ; LAP6-2 | 46.87 
2

ディクショナリはソートされていないので、ディクショナリだけではできません。ただし、キーのソートされたリストを取得し、そこから行くことができる:

import itertools 

keys = sorted(my_dict.keys(), key=lambda k:int(k.split('-')[0][3:])) 
keys, ks = tee(keys) 
next(ks, None) 

for k1,k2 in zip(keys, ks): 
    print("{} | {} ; {} | {}".format(k1, my_dict[k1], k2, my_dict[k2])) 
1

これは、あなたが探しているものをプリントアウトします:

keys_in_order = sorted(my_dict.keys()) 

for i in range(len(keys_in_order) - 1): 
    print(keys_in_order[i] + " | " + str(my_dict[keys_in_order[i]]) + " ; " + keys_in_order[i + 1] + " | " + str(my_dict[keys_in_order[i + 1]])) 
2

あなたがして正しい軌道に乗っていますrange()を使用していますが、リストが返されるという点では正しいですが、データセットが大きい場合は効率的ではありません。この問題を軽減するには、反復可能なオブジェクトを返すxrangeを使用します。

>>> my_dict = { 
...  'LAP0-1': 146.48, 
...  'LAP1-1':44.11, 
...  'LAP2-1':25.54, 
...  'LAP3-1':75.29, 
...  'LAP5-2':85.76, 
...  'LAP6-2':46.87 
... } 
>>> keys = my_dict.keys() 
>>> for i in xrange(0, len(keys), 2): 
...  key1 = keys[i] 
...  key2 = keys[i+1] 
...  print key1, key2, my_dict[key1], my_dict[key2] 
... 
LAP3-1 LAP0-1 75.29 146.48 
LAP5-2 LAP1-1 85.76 44.11 
LAP6-2 LAP2-1 46.87 25.54 

あなたはまだ新しいキーのリストを作成していますが、それはおそらく大丈夫です。

編集:辞書はであり、順不同であることに注意してください。順序付けされた辞書が必要な場合は、OrderedDictを使用する必要がありますが、それほど高速ではありません。

+0

タイプミスを修正し、値を印刷して追加しました。 –

+0

質問者が '範囲'のことに関心を持っているのは、「範囲」ではないようです。別の 'my_list'リストのようです。また、 'keys()'は、特定の順序でキーを返すことは保証されていません。 – user2357112

+0

さて、私は2から1に作成される新しいリストの数を減らしました。 –

1

補足答弁:他の回答で述べたように、バニラ辞書がそのキーのない定義された順序を持っていません。しかし、collectionsモジュールは、スキップのために、この順

>>> keys=("A", "nice", "sunny", "day",) 
>>> d={} 
>>> for key in keys: d[key]=1 
... 
>>> for key in d: print (key) 
... 
sunny 
day 
nice 
A 

>>> from collections import OrderedDict 
>>> d=OrderedDict() 
>>> for key in keys: d[key]=1 
... 
>>> for key in d: print (key) 
... 
A 
nice 
sunny 
day