缺少Python字典分配

时间:2015-05-28 20:11:39

标签: python

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”赋值的值与“{}”不同。

3 个答案:

答案 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键:

  1. pair存在;返回对值的引用
  2. pair不存在;将lut[pair]设置为第二个参数({}),然后将其返回。
  3. 无论哪种方式,您现在都可以引用lut[pair]引用的对象,它始终是字典。

    修改该字典意味着所有参考文献都可以看到这些更改。 d[letter] = d.get(letter, 0) + 1将在该字典中设置键值对。由于dlut[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}