3.7 反转字典

字典支持高效查找,只要你想获得任意键的值。如果d是一个字典,k是一个键,输入d[k],就立即获得值。给定一个值查找对应的键要慢一些和麻烦一些:

  1. >>> counts = defaultdict(int)
  2. >>> for word in nltk.corpus.gutenberg.words('milton-paradise.txt'):
  3. ... counts[word] += 1
  4. ...
  5. >>> [key for (key, value) in counts.items() if value == 32]
  6. ['brought', 'Him', 'virtue', 'Against', 'There', 'thine', 'King', 'mortal',
  7. 'every', 'been']

如果我们希望经常做这样的一种“反向查找”,建立一个映射值到键的字典是有用的。在没有两个键具有相同的值情况,这是一个容易的事。只要得到字典中的所有键-值对,并创建一个新的值-键对字典。下一个例子演示了用键-值对初始化字典pos的另一种方式。

  1. >>> pos = {'colorless': 'ADJ', 'ideas': 'N', 'sleep': 'V', 'furiously': 'ADV'}
  2. >>> pos2 = dict((value, key) for (key, value) in pos.items())
  3. >>> pos2['N']
  4. 'ideas'

首先让我们将我们的词性字典做的更实用些,使用字典的update()方法加入再一些词到pos中,创建多个键具有相同的值的情况。这样一来,刚才看到的反向查找技术就将不再起作用(为什么不?)作为替代,我们不得不使用append()积累词和每个词性,如下所示:

  1. >>> pos.update({'cats': 'N', 'scratch': 'V', 'peacefully': 'ADV', 'old': 'ADJ'})
  2. >>> pos2 = defaultdict(list)
  3. >>> for key, value in pos.items():
  4. ... pos2[value].append(key)
  5. ...
  6. >>> pos2['ADV']
  7. ['peacefully', 'furiously']

现在,我们已经反转字典pos,可以查任意词性找到所有具有此词性的词。可以使用 NLTK 中的索引支持更容易的做同样的事,如下所示:

  1. >>> pos2 = nltk.Index((value, key) for (key, value) in pos.items())
  2. >>> pos2['ADV']
  3. ['peacefully', 'furiously']

3.2给出 Python 字典方法的总结。

表 3.2:

Python 字典方法:常用的方法与字典相关习惯用法的总结。

  1. >>> from nltk.corpus import brown
  2. >>> brown_tagged_sents = brown.tagged_sents(categories='news')
  3. >>> brown_sents = brown.sents(categories='news')