我正在制作一个程序,要求我一次循环一个字典两个键。这是我字典的简单表示。
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];
但是有可能一次循环字典两个键吗?
我想在循环中打印出以下内容:
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
我想到的另一个解决方案但不适用于我的情况:
for i in range(0, len(my_list), 2):
print my_dict[my_list[i]] + " | " my_dict[my_list[i+1]];
其中my_list[i]
为'LAP0-1'
,my_list[i+1]
为'LAP1-1'
。只保存这样的2个数据结构似乎效率低下。如何一次循环字典两个键?
答案 0 :(得分: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 :(得分: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,但速度并不快。
答案 2 :(得分: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))
<强>输出强>
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
答案 3 :(得分: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]]))
答案 4 :(得分:1)
补充答案:如其他答案中所述,一个香草字典没有明确的键排序。但是,collections
模块提供OrderedDict
,它会记住其键定义的顺序,并允许您按此顺序迭代它
>>> 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