gpt4 book ai didi

python - Python 3 中 .keys() 的最 Pythonic 替代品

转载 作者:行者123 更新时间:2023-12-01 01:37:06 26 4
gpt4 key购买 nike

我一直在考虑将我的 Python 2.7 项目转换为 3。我发现我大部分时间都在使用 .keys() ,这是不必要的

for x in d:

效果相同
for in in d.keys():

但是我也了解到,在迭代字典时不应该改变字典。这还没有出现,因为我一直在使用 Python2.7 的 .keys() ,它创建了字典键的副本作为列表。 Python 3 版本的 .keys() 创建一个 View 而不是副本,因此不能用于相同目的。

2to3 将 d.keys() 转换为 list(d.items()) 但我并不严格需要列表中的键。我已经看到建议 d.copy().keys() 但我不明白为什么 (Python 3) .keys() 位是必要的。

在 Python 文档中它说

It is safe to modify the values of the keys as you iterate over the dictionary, but only so long as the set of keys does not change

那么“变异”仅指更改 key 吗?大多数情况下,我只在迭代时更改字典值,但我发现某个地方有可能删除当前键

那么基本上我需要用任何东西替换 .keys() 吗?如果是的话,最Pythonic/高效的选项是什么?

具体代码(我在冒险游戏/交互式小说引擎中实现重复效果/随时间损坏的部分)是:

def Age(beats) :
actions = []
for echo in echoes.keys() :
echoes[echo]['elapsed'] += beats
activations = echoes[echo]['elapsed']/echoes[echo]['interval']
while activations >= 1 :
actions.append(str(echoes[echo]['action']))
echoes[echo]['elapsed'] -= echoes[echo]['interval']
activations = echoes[echo]['elapsed']/echoes[echo]['interval']
try :
echoes[echo]['reps'] -= 1
if echoes[echo]['reps'] < 1 :
del echoes[echo]
break
except TypeError : #Will be raised if reps is Infinite
pass
char['Echoes'] = echoes
char.write()
return actions

是的,我可能独自在这里犯下了各种风格指南的错误。我是自学成才的,发现所有好的实践对于这个项目来说已经太晚了。抱歉,如果我让你的眼睛流血了。

最佳答案

我建议创建一个需要删除的键列表,然后在完成循环后删除它们:

def Age(beats):
to_remove = []
actions = []
for echo in echoes.keys():
echoes[echo]['elapsed'] += beats
activations = echoes[echo]['elapsed']/echoes[echo]['interval']
while activations >= 1 :
actions.append(str(echoes[echo]['action']))
echoes[echo]['elapsed'] -= echoes[echo]['interval']
activations = echoes[echo]['elapsed']/echoes[echo]['interval']
try :
echoes[echo]['reps'] -= 1
if echoes[echo]['reps'] < 1 :
to_remove.append(echo)
break
except TypeError : #Will be raised if reps is Infinite
pass
for echo in to_remove:
del echoes[echo]
char['Echoes'] = echoes
char.write()
return actions

我还认为使用 .items() 更具可读性:

for echo, value in echoes.items():
value['elapsed'] += beats
...

关于python - Python 3 中 .keys() 的最 Pythonic 替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52302106/

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