gpt4 book ai didi

添加到集合并关心它是否有效的 Pythonic 方法?

转载 作者:太空宇宙 更新时间:2023-11-04 08:58:34 24 4
gpt4 key购买 nike

我经常发现,在使用 Pythonic 集合时,Pythonic 方式似乎不存在。

例如,执行类似 dijkstra 或 a* 的操作:

openSet, closedSet = set(nodes), set(nodes)
while openSet:
walkSet, openSet = openSet, set()
for node in walkSet:
for dest in node.destinations():
if dest.weight() < constraint:
if dest not in closedSet:
closedSet.add(dest)
openSet.add(dest)

这是一个弱做作的例子,重点是最后三行:

if not value in someSet:
someSet.add(value)
doAdditionalThings()

鉴于 Python 的工作方式,例如,访问/使用字典的值,我希望能够做到:

try:
someSet.add(value)
except KeyError:
continue # well, that's ok then.
doAdditionalThings()

作为一名 C++ 程序员,我的皮肤有点爬行,我什至做不到:

if someSet.add(value):
# add wasn't blocked by the value already being present
doAdditionalThings()

是否有更 Pythonic(如果可能的话更有效)的方式来处理这种 set-as-guard 用法?

最佳答案

添加操作不应该同时告诉您该项目是否已经在集合中;它只是确保它在您添加后就在那里。或者换句话说,您想要的不是“添加一个项目并检查它是否有效”;而是您想要首先检查该项目是否存在,如果不存在,则执行一些特殊操作。如果您只想添加项目,则根本不会进行检查。这种模式没有任何不符合 Python 的地方:

if item not in someSet:
someSet.add(item)
doStuff()
else:
doOtherStuff()

的确,API 可以设计成 .add 返回项目是否已经存在,但根据我的经验,这不是一个特别常见的用例。集合的部分要点是您可以自由添加项目而不用担心它们是否已经在那里(因为添加已经包含的项目没有效果)。此外,让 .add 返回 None 与 Python 内置类型的一般约定一致,即改变其参数的方法返回 None。像 dict.setdefault(它获取一个项目但如果不存在则首先添加它)之类的东西确实是不寻常的情况。

关于添加到集合并关心它是否有效的 Pythonic 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27881695/

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