通过阅读一些代码并尝试理解字典中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,我们正在写出另外两个称为matchedcsv_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] =无的用法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23041003/

10-10 00:13