我想从字典 B 构建字典 A。如果在 B 中找不到特定的键,则什么也不做继续执行。
哪种方式更好?
try:
A["blah"] = B["blah"]
except KeyError:
pass
或者if "blah" in B:
A["blah"] = B["blah"]
“Do and ask for forgiveness”与“简单明了”哪个更好?为什么?
try:
A["blah"] = B["blah"]
except KeyError:
pass
或者if "blah" in B:
A["blah"] = B["blah"]
“Do and ask for forgiveness”与“简单明了”哪个更好?为什么?
异常不是条件语句。
条件语句版本更加清晰。这很自然:这是直接的流程控制,这也是条件语句的设计目的,而不是异常。
异常版本主要用于在循环中进行查找时进行优化:对于某些算法,它允许消除内部循环中的测试。但在这里并没有这种好处。它有一个小优点,就是避免了两次输入"blah",但如果你经常这么做,你应该考虑使用一个辅助函数move_key
。
总的来说,除非你有特定的原因不这样做,我强烈建议默认使用条件语句版本。条件语句是明显的解决方案,通常建议优先考虑一种解决方案而不是另一种。
如果查找操作比较耗费时间,还有一种避免异常和双重查找的第三种方法:
value = B.get("blah", None)
if value is not None:
A["blah"] = value
如果你希望字典中包含None
值,你可以使用一些更加神秘的常量,比如NotImplemented
、Ellipsis
或者自己创建一个新的:
MyConst = object()
def update_key(A, B, key):
value = B.get(key, MyConst)
if value is not MyConst:
A[key] = value
无论如何,对于我来说,使用update()
是最易读的选项:
a.update((k, b[k]) for k in ("foo", "bar", "blah") if k in b)
据我理解,您想要使用字典B中的键值对更新字典A。
update
是更好的选择。
A.update(B)
示例:
>>> A = {'a':1, 'b': 2, 'c':3}
>>> B = {'d': 2, 'b':5, 'c': 4}
>>> A.update(B)
>>> A
{'a': 1, 'c': 4, 'b': 5, 'd': 2}
>>>
A.update({k: v for k, v in B.iteritems() if k in specificset})
@LeeMobile - A.update({k: v for k, v in B.iteritems() if k in specificset})
- Omnifarious摘自Python性能维基的直接引用:
除了第一次之外,每次检测单词时,if语句的测试都会失败。如果你要计数大量单词,很可能会有多个单词出现多次。在只需要初始化值一次且该值的增加将发生多次的情况下,使用try语句更便宜。
因此,根据情况选择两种选项都是可行的。有关更多详细信息,请查看此链接:Try-except-performance
try:
A["foo"] = B["foo"]
A["bar"] = B["bar"]
A["baz"] = B["baz"]
except KeyError:
pass
B
中,代码就会终止。如果这段代码有意义,那么应该使用异常方法,否则使用测试方法。在我看来,因为它更简短并明确表达了意图,所以比异常方法更容易阅读。update
。如果您正在使用支持字典推导的 Python 版本,则强烈建议使用以下代码:updateset = {'foo', 'bar', 'baz'}
A.update({k: B[k] for k in updateset if k in B})
for key in ["foo", "bar", "baz"]: try: A[key] = B[key]
。 - Zim我认为这里的一般规则是,如果A["blah"]
通常存在,那么使用try-except是好的,如果不存在,则使用if "blah" in b:
我认为"try"在时间上比较廉价,但"except"更昂贵。
Python 3.8
开始,并引入 赋值表达式(PEP 572) (:=
运算符),我们可以将条件值 dictB.get('hello', None)
捕获到变量 value
中,以便在条件体内既检查它是否不是 None
(因为 dict.get('hello', None)
返回关联值或 None
),然后在条件体中使用它:# dictB = {'hello': 5, 'world': 42}
# dictA = {}
if value := dictB.get('hello', None):
dictA["hello"] = value
# dictA is now {'hello': 5}
None
呢?例如,dictA["A"]=None。 - kilasuelika在其他语言中,规则是将例外保留给异常情况,即在常规使用中不会发生的错误。不知道这条规则如何适用于Python,因为按照这个规则,StopIteration不应该存在。
就我个人而言,我更倾向于使用第二种方法(但使用has_key
):
if B.has_key("blah"):
A["blah"] = B["blah"]
has_key
已弃用-因此,我想最好写成。if "blah" in B:
A["blah"] = B["blah"]
if "blah" in B.keys()
或者if B.has_key("blah")
。 - girasquidA.update(B)
对你没起作用吗? - SilentGhosthas_key
已经被弃用,推荐使用in
来检查元素是否在字典中。同时,检查B.keys()
会将一个O(1)的操作变成一个O(n)的操作。 - kindall.has_key
已经被弃用,在使用keys()
时会创建不必要的列表,并且在Python3中是多余的。请注意不要改变原意。 - SilentGhostA = dict((k, v) for (k, v) in B if we_want_to_include(k))
。 - Karl Knechtel