from itertools import tee
d = { "a": 1, "b": 2, "c": 3 }
iterd = iter(d)
for k in d:
print(k+":")
next(iterd)
iterd,rest = tee(iterd)
for k in rest:
print("\t",k)
字符串 产出:
a:
b
c
b:
c
c:
型
注意:这个解决方案虽然在概念上很有趣,但从效率的Angular 来看可能相当糟糕 *
更有效的解决方案是使用队列:
from collections import deque
d = { "a": 1, "b": 2, "c": 3 }
qd = deque(d)
while qd:
print(qd.popleft()+":")
for k in qd:
print("\t",k)
型 或者一个简单的列表(不删除/弹出项目):
d = { "a": 1, "b": 2, "c": 3 }
ld = list(d)
for i,k in enumerate(ld,1):
print(k+":")
for j in range(i,len(d)):
print("\t",ld[j])
4条答案
按热度按时间uemypmqf1#
字符串
myzjeezk2#
两个迭代器解决方案...
这一个显式创建一个迭代器,这样我们就可以访问它(不像
for k in d:
使用的隐式迭代器)。然后我们遍历这个迭代器。通过for k in keys:
获得每个键后,迭代器是对剩余键的迭代器。浅复制让我们遍历它们,而不会干扰我们的主迭代器,也不会复制dict内容。字符串
输出(Attempt This Online!):
型
或者,使用
islice
(Attempt This Online!):型
每个
islice
通过快速迭代来“跳过”第一个i
键,所以总的来说,这有点浪费双迭代,但它相当快,特别是与print
s相比。还有两种解决方案,它们确实复制了内容,但比你的短。
它的灵感来自于Guy's。
deikduxw3#
由于顺序并不重要,您可以每次弹出一个键并获得其余部分
字符串
如果你不再需要原来的字典,你可以去掉
temp_d
。33qvvth14#
对于基于迭代器的方法,您可以使用itertools中的
tee
函数来“快照”字典键上的迭代器。字符串
产出:
型
更有效的解决方案是使用队列:
型
或者一个简单的列表(不删除/弹出项目):
型