gpt4 book ai didi

python - 理解 d[key] = None 的用法

转载 作者:行者123 更新时间:2023-12-01 05:16:47 24 4
gpt4 key购买 nike

通过阅读一些代码并尝试理解字典中 None 的用法来学习一些Python。您能否对以下片段提供更多说明。以及 = None 的用法。

for pc in csv_dict:
if pc in shp_dict:
matched[pc] = None
else:
csv_not_in_shp[pc] = None

谢谢

最佳答案

我认为您感到困惑是对的,因为我认为这并不是 Python 编码的最佳示例。只需查看标识符名称,我们就可以看出作者的意图:

for pc in csv_dict:
if pc in shp_dict:
matched[pc] = None
else:
csv_not_in_shp[pc] = None

这里我们有一个 csv_dictshp_dict 进来,我们正在写入另外两个名为 matched 的字典>csv_not_in_shp。显然,这是为稍后设置的类似测试,作者可以看到:

if thing in matched:
# it was in both csv_dict and shp_dict earlier
elif thing in csv_not_in_shp:
# it wasn't so do something else

当你像这样分解它时,你已经可以开始看到问题了。例如,为什么这里需要 elif ?这很容易被重写:

if thing in matched:
# it was in both csv_dict and shp_dict earlier
else:
# it wasn't so do something else

这(可能是正确的)表明 csv_not_in_shp 根本没有必要。

但是让我们相信原作者是无罪的。也许 csv_dictshp_dict 在此比较时不会出现。 (相当弱的理由,因为它们可能是从matchedcsv_not_in_shp相同的地方传递的,但是......)这里的真正问题问题是作者使用 None 作为该值,因为他不关心该值是什么。换句话说,他经常将其用作 NULL 占位符。

问题是,这是因为他没有将键映射到值。作者忽略了集合的一个明确用例。观察:

matched = set()
for pc in csv_dict:
if pc in shp_dict:
matched.add(pc)

现在我们正在说出我们真正的意思。这是一个说明该概念的基本示例。令 d 是将字母“a”到“e”映射到数字 0 到 4 的字典,而 d_ 是将“d”映射到“g”的字典数字 3 到 6。(我将在下面使用 OrderedDicts,以便按键以更易读的格式呈现。否则它们是不必要的。)

>>> import string
>>> from collections import OrderedDict as od
>>> d = od([(k,v) for k, v in zip(string.ascii_lowercase[:5], range(5))])
>>> d_ = od([(k,v) for k, v in zip(string.ascii_lowercase[3:7], range(3,7))])
>>> d
OrderedDict([('a', 0), ('b', 1), ('c', 2), ('d', 3), ('e', 4)])
>>> d_
OrderedDict([('d', 3), ('e', 4), ('f', 5), ('g', 6)])
>>> matched = set()
>>> for key in d:
... if key in d_:
... matched.add(key)
...
>>> matched
{'e', 'd'}

有了集合,我们仍然可以进行in匹配,这就是我们首先想要的:

>>> 'a' in matched
False
>>> 'd' in matched
True

当然,最好的事情是整个事情可以简化为一个集合理解:

>>> {key for key in d if key in d_}
{'e', 'd'}

因此 matched = {pc for pc in csv_dict if pc in shp_dict} 会更正确地用一组替换原始代码,按照我的示例。

关于python - 理解 d[key] = None 的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23041003/

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