python 如何在循环字典时覆盖字典中的剩余项?

jtjikinw  于 6个月前  发布在  Python
关注(0)|答案(4)|浏览(59)

在迭代字典时,有没有更干净的方法来遍历字典的后续键?

d = { "a": 1, "b": 2, "c": 3 }

k = list(d.keys())

for i in range(len(k)):
    print(k[i] + ":")
    for j in range(i+1, len(k)):
        print("\t" + k[j])

个字符
感觉应该可以使用迭代器。

uemypmqf

uemypmqf1#

d = { "a": 1, "b": 2, "c": 3 }
k = list(d)
for i in range(len(k)):
    print(k[i], k[i+1:])

字符串

myzjeezk

myzjeezk2#

两个迭代器解决方案...
这一个显式创建一个迭代器,这样我们就可以访问它(不像for k in d:使用的隐式迭代器)。然后我们遍历这个迭代器。通过for k in keys:获得每个键后,迭代器是对剩余键的迭代器。浅复制让我们遍历它们,而不会干扰我们的主迭代器,也不会复制dict内容。

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)

字符串
输出(Attempt This Online!):

a:
    b
    c
b:
    c
c:


或者,使用isliceAttempt This Online!):

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 s相比。
还有两种解决方案,它们确实复制了内容,但比你的短。

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's

deikduxw

deikduxw3#

由于顺序并不重要,您可以每次弹出一个键并获得其余部分

d = {"a": 1, "b": 2, "c": 3}
temp_d = d.copy()
while temp_d:
    print(temp_d.popitem()[0] + ":", temp_d.keys())

字符串
如果你不再需要原来的字典,你可以去掉temp_d

33qvvth1

33qvvth14#

对于基于迭代器的方法,您可以使用itertools中的tee函数来“快照”字典键上的迭代器。

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

相关问题