有两种基于迭代器的解决方案...
第一个方案明确创建了一个迭代器,以便我们能够访问它(不同于使用 for k in d:
时隐式使用的迭代器)。通过 for k in keys:
循环获取每个键之后,该迭代器就变成了剩余键的迭代器。通过浅复制,我们可以在不干扰主迭代器且不复制字典内容的情况下遍历这些剩余键。
from copy import copy
d = {"a": 1, "b": 2, "c": 3}
keys = iter(d)
for k in keys:
print(k + ":")
for k in copy(keys):
print("\t" + k)
输出(在线尝试):
a:
b
c
b:
c
c:
另一种替代方案,使用 islice
(在线尝试):
from itertools import islice
d = {"a": 1, "b": 2, "c": 3}
for i, k in enumerate(d, 1):
print(k + ":")
for k in islice(d, i, None):
print("\t" + k)
每一次 islice
都通过快速遍历前 i
个键来“跳过”它们,因此总体上有些浪费双层迭代。但是相比 print
操作,这种方式相当快速。
还有另外两种解决方案,虽然它们确实复制了字典内容,但比你提供的代码更简短。
d = {"a": 1, "b": 2, "c": 3}
ks = list(d)
for i, k in enumerate(ks, 1):
print(k + ":")
for k in ks[i:]:
print("\t" + k)
d = {"a": 1, "b": 2, "c": 3}
ks = list(d)
while ks:
print(ks.pop(0) + ":")
for k in ks:
print("\t" + k)
后一种方法受到了 Guy的回答 启发。