Python:循环字典,一次两个键

Python:循环字典,一次两个键,python,dictionary,Python,Dictionary,我正在做一个程序,要求我一次循环两个键。这是我字典的一个简单表示 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; 我

我正在做一个程序,要求我一次循环两个键。这是我字典的一个简单表示

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'
。这样存储和保存两个数据结构似乎效率低下。如何一次循环一个字典两个键?

你不能只使用一个字典,因为字典是未排序的。但是,您可以获得一个已排序的键列表,然后从中开始:

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]))

你不能仅仅用一本字典来做这件事,因为字典是未分类的。但是,您可以获得一个已排序的键列表,然后从中开始:

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]))

这将打印出您要查找的内容:

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]]))

这将打印出您要查找的内容:

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]]))

您使用
range()
的方法是正确的,但是它返回一个列表,如果数据集很大,那么这个列表就不是很有效。您可以通过使用来缓解这种担忧,它返回一个可以迭代的对象

>>> 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
您仍在创建一个新的键列表,但这可能没问题


编辑:您可能还应该知道字典是无序的。如果要使用有序词典,则必须使用,但速度不快。

使用
range()
的方法是正确的,但它会返回一个列表,如果数据集很大,则效率不高。您可以通过使用来缓解这种担忧,它返回一个可以迭代的对象

>>> 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
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))
您仍在创建一个新的键列表,但这可能没问题

编辑:您可能还应该知道字典是无序的。如果你想要有序的字典,你必须使用,这并没有那么快

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
输出

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

补充答案:如其他答案所述,普通字典没有定义键的顺序。但是,
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

补充答案:如其他答案所述,普通字典没有定义键的顺序。但是,
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

对于skip every k元素,您是否希望dict记住您写入条目的顺序?口述在语义上是无序的;它们是键值查找结构。对它们进行迭代可能会产生与您编写的顺序完全不同的顺序。如果您真正想要的是有序对序列,那么元组列表通常是更好的数据结构。对于跳过每个k元素,您是否希望dict记住您以什么顺序写入条目?口述在语义上是无序的;它们是键值查找结构。对它们进行迭代可能会产生与您编写的顺序完全不同的顺序。如果你真正想要的是有序对序列,那么元组列表通常是更好的数据结构。我修正了一个输入错误并添加了打印值的功能。提问者对
范围
的关注似乎不是
范围
;它似乎是单独的
my_列表
列表。另外,
keys()
不能保证按任何特定顺序返回密钥。我将创建的新列表的数量从2减少到1。我修复了一个拼写错误并添加了打印值的功能。提问者对
范围
的关注似乎不是
范围
;它似乎是单独的
my_列表
列表。而且,
keys()
不能保证按任何特定顺序返回密钥。我将创建的新列表的数量从2减少到1。