通过阅读一些代码来学习一些python并尝试理解字典上的None的用法。您能否对以下片段进行更多说明。和使用=无。
for pc in csv_dict:
if pc in shp_dict:
matched[pc] = None
else:
csv_not_in_shp[pc] = None
谢谢
答案 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
答案 1 :(得分:1)
我认为你应该感到困惑,因为这并不是我最好的Python编码示例。只要查看标识符名称,我们就可以看到作者的意图:
for pc in csv_dict:
if pc in shp_dict:
matched[pc] = None
else:
csv_not_in_shp[pc] = None
所以我们有一个csv_dict
和shp_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_dict
和shp_dict
可能不会出现。 (相当弱的原因,因为他们本可以从同一个地方matched
和csv_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}
会更加正确地用一个集合替换原始代码,按照我的例子。