gpt4 book ai didi

python遍历字典

转载 作者:太空狗 更新时间:2023-10-29 17:07:20 24 4
gpt4 key购买 nike

我有两本字典。我正在一个又一个地迭代它。我想在每次在内循环内而不是从头开始迭代时选择下一个项目。

dict1={'a':1 , 'b':2 , 'c':3}
dict2={'x':10, 'y':20, 'z':30}

for key,value in dict1:
#do something
for k,v in dict2:
#do something

当key='a'时,它会遍历内循环,并根据该循环中的代码做一些 Action 。假设它选择的 Action 是dict2中的'x'。现在,当我必须使用 key='b' 进行迭代时,我希望内部循环的迭代从 'y' 开始,因为已经选择了 'x'。

最佳答案

首先,for key,value in dict1 不会执行您想要的操作 — 它只是遍历 。如果你想遍历键值对,你需要for key, value in dict1.items()

与此同时,听起来您要求的是锁步迭代,而不是嵌套迭代?如果是这样,您需要 zip 函数:

for (k1, v1), (k2, v2) in zip(dict1.items(), dict2.items()):
# do something

但请注意,这给您的排序实际上是任意的,因为字典的排序本质上是任意的。所以,如果您对 ('a', 'x') 感到满意,那么 ('b', 'y') 等等,以及 满意('a', 'y'),然后是('b', 'x'),然后是zip 是你想要的。如果不是,那就不是。

(如果您希望您的 dict 具有某些固有顺序,例如插入顺序、排序顺序或其他任何顺序,您将不得不使用不同的类。例如,collections.OrderedDict 就像一个字典,但保持插入顺序。)


如果您想要更复杂的东西,您可以通过编程方式将迭代移动到 dict2 上,而您无法用单行代码表达,您始终可以使用 iteration protocol手动:

iter2 = iter(dict2.items())
for k1, v1 in dict1.items():
k2, v2 = next(iter2)
# do something
# maybe do another k2, v2 = next(iter2)
# maybe restart iter2 = iter(dict2.items())
# and so on

正如文档所解释的那样,当 next(iter2) 结束时,它将引发 StopIteration。如果你不想那样怎么办?也许你想,正如你在评论中所建议的那样,重新开始?您可以通过捕获 StopIteration 或使用 next 的双参数形式并检查哨兵来解决该问题。例如:

try:
k2, v2 = next(iter2)
except StopIteration:
iter2 = iter(dict2.items())
k2, v2 = next(iter2)

或者您甚至可以编写循环迭代包装器:

def circular_iterate(iterable_factory):
while True:
yield from iterable_factory():

在 Python 3.2 或更早版本中,您必须将 yield from 替换为内部循环:

def circular_iterate(iterable_factory):
while True:
for value in iterable_factory():
yield value

现在:

iter2 = circular_iterate(dict2.items) # note, not dict2.items()

如果您尝试跟踪的不仅仅是“当前位置”,您可能需要一个额外的数据结构。例如,如果您想跳过到目前为止看到的所有键,请使用到目前为止看到的 set 键,或未看到的set 键:

seen_items_2 = set()
for k1, v1 in dict1.items():
for k2, v2 in dict2.items():
if k2 in seen_items_2:
continue
seen_items_2.add(k2)
# do something

关于python遍历字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21319774/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com