Python将键/值存储在词典中。
在此示例中,值(它们是字典本身)存储在“lut”中。
lut = {}
pair=" "
line = "halhak"
for letter in line.strip() + ' ':
d = lut.setdefault(pair, {})
d[letter] = d.get(letter, 0) + 1
pair = pair[1] + letter
键/值为:
for key in lut:
print key, "/", lut[key]
/ {'h': 1}
ak / {' ': 1}
al / {'h': 1}
lh / {'a': 1}
ha / {'k': 1, 'l': 1}
h / {'a': 1}
我的问题: 我没有看到循环将“lut”赋值的值与“{}”不同。
答案 0 :(得分:1)
d
始终是对lut
的某些元素的引用。这是一个类似的例子,展示了它的工作原理。
>>> lut = {1 : {}}
>>> d = lut[1]
>>> d is lut[1]
True
lut[1]
是对某些字典的引用,d
的值是对同一字典的引用,由is
运算符验证。 d
上的操作和lut[1]
上的操作对同一对象进行操作。
在您的实际代码中,需要调用setdefault
:
d = lut.setdefault(pair, {})
setdefault
方法执行两项操作:如果pair
不在lut
中,则首先将lut[pair]
的值设置为给定值。然后它返回lut[pair]
的值。它与以下代码相同
if pair not in lut:
lut[pair] = {}
d = lut[pair]
答案 1 :(得分:0)
使用{}
,只有空字母lut
会直接添加到setdefault()
。
如documentation中所述,setdefault
始终返回任何给定键的值:
setdefault(key [,default])
如果键在词典中,则返回其值。 如果不是,请插入值为default的值并返回default。默认默认为无。
因此d
始终是一个字典 - 外部lut
字典中的一个值。
然而,下一行修改lut
中的其中一个(最初是空的)dicts,
这就是你在结果中看到填充的dicts的原因。
答案 2 :(得分:0)
表达式d = lut.setdefault(pair, {})
执行以下两项操作之一,具体取决于是否存在pair
键:
pair
存在;返回对值的引用pair
不存在;将lut[pair]
设置为第二个参数({}
),然后将其返回。无论哪种方式,您现在都可以引用lut[pair]
引用的对象,它始终是字典。
修改该字典意味着所有参考文献都可以看到这些更改。 d[letter] = d.get(letter, 0) + 1
将在该字典中设置键值对。由于d
和lut[pair]
都引用了该字典,因此您可以稍后迭代lut
以查看这些更改。
快速演示:
>>> lut = {}
>>> d = lut.setdefault('foo', {})
>>> lut
{'foo': {}}
>>> d
{}
>>> d is lut['foo']
True
>>> d['bar'] = 42
>>> d
{'bar': 42}
>>> lut
{'foo': {'bar': 42}}
>>> lut['foo']
{'bar': 42}