通过阅读一些代码并尝试理解字典中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_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
是将字母'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/