根据Python中的分类词汇有效地匹配单词

时间:2019-05-27 12:14:09

标签: python search

一方面,我有按字母顺序排序的名词词汇(#7000)

class MediaPlaceholder extends Component {
  constructor(props){
    super(props)
    this.state = {
      file: null
    }
    this.handleChange = this.handleChange.bind(this)
  }
  handleChange(event) {
    this.setState({
      file: URL.createObjectURL(event.target.files[0])
    })
  }
  render() {
    const {classes} = this.props;
    return (
      <Paper className={classes.media}>
        <div>
          <label htmlFor="upload-file">
            <Button  onClick={event => this.handleChange(event)}>
              Add media...
              <input
                accept="image/*"
                className={classes.input}
                id="upload-file"
                type="file"
              />
            </Button>
          </label>
        </div>
      </Paper>
    );
  }
}

另一方面,我有一组单词(#1E6)

aardvark
abacus
abbey
abbreviation
abdomen
ability
abnormal

找出词汇中是否存在单词和索引的最有效方法是什么?

我可以简单地使用列表/数组并比较字符串,但这没有利用词汇的字母排序

3 个答案:

答案 0 :(得分:1)

您可以使用bisect来利用排序的词汇:

In [1]: d = ["aardvark", "abacus", "abbey", "abbreviation"]
In [2]: w = ['Hello', 'airport', 'really', 'sorry', 'to', 'hear', 'this', "aardvark"]
In [3]: for wd in w:
    ...:     try:
    ...:         index = bisect.bisect_left(d, wd)
    ...:         found = d[index]
    ...:         if found == wd:
    ...:             print(f"{wd} found at index {index}")
    ...:     except IndexError:
    ...:         pass
    ...:
aardvark found at index 0

另一种选择是使用字典,并搜索word in setdictionary.get(word)作为索引-您可以阅读我的答案here以获得有关dict实现的详细信息CPython。

答案 1 :(得分:1)

如先前评论:

>>> vocab = ['a', 'b', 'c']
>>> vocab_lookup = {k:v for v,k in enumerate(vocab)}

现在您只需要使用dict.get或简单地使用dict[]

>>> 'a' in vocab_lookup
True
>>> 'd' in vocab_lookup
False
>>> vocab_lookup.get('a')
0
>>> vocab_lookup.get('d')
>>> # None

答案 2 :(得分:0)

如果字典中有唯一的条目(正如我期望的那样),则可以使用字典。如果x in dict是给定true中的键,并且(没有哈希冲突)花费静态时间,则x返回dict,这是我们所能得到的最好的结果。值得一提的是,最坏的情况是O(n),但通常接近最好的情况。有关详细信息,请参见this问题。

要获取以索引为值的字典,请使用以下行:

newdict = dict((k, v) for k, v in enumerate(sortedlist))

[编辑:]请注意,这根本不依赖排序列表或任何列表。它适用于任何可迭代的情况,包括打开的文件(每行一个单词)或string.split()...

如果要保留当前的数据结构,则可以使用子类型化或文档编制来将dict保留在幕后,并且该更新用于此类查找。