了解d [key]的使用=无

时间:2014-04-13 09:24:29

标签: python dictionary

通过阅读一些代码来学习一些python并尝试理解字典上的None的用法。您能否对以下片段进行更多说明。和使用=无。

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

谢谢

2 个答案:

答案 0 :(得分:1)

None与其他编程语言中的null(带subtle differences)类似。在这种情况下,它用于指示键pc当前没有值。因此,当您尝试访问它时,它只会返回None而不是给您一个KeyError。

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

这是Useful Reference

答案 1 :(得分:1)

我认为你应该感到困惑,因为这并不是我最好的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为dict,将字母'a'映射到'e'到数字0到4,d_是dict映射'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}会更加正确地用一个集合替换原始代码,按照我的例子。