了解使用d [key] =无

通过阅读一些代码学习一些python并试图理解字典上的None的用法。 你能否在下面的片段中提供一些更多的信息。 和= 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可能不会出现。 (相当弱的原因,因为他们可能已经被传递了,大概是matched的地方,而csv_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_是将数字3到6的'd'映射到'g'的字典。(我将在下面使用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}可以更正确地用你的代码替换你的原始代码。


在其他编程语言中, None一个类似于null (具有细微差别)。 在这种情况下,它被用来指示键盘pc当前没有值。 因此,当您尝试访问它时,而不是给你一个KeyError,它将简单地返回None

None也可以用于if语句来检查是否存在:

>>> a = None
>>> b = 5

>>> if a:
...     print 'a Exists'
>>> if b:
...     print 'b Exists'
...
b Exists

在上面的例子中, if语句检查值是否存在并且不是None

更接近你的例子:

>>> a = [None,None,1,2.234,'d',None]
>>> for i,item in enumerate(a):
...     if item:
...         print i, item
...
2 1
3 2.234
4 d

这里是一个有用的参考

链接地址: http://www.djcxy.com/p/76635.html

上一篇: Understanding the use of d[key] = None

下一篇: Python If Function for Ranged Field