一方面,我有按字母顺序排序的名词词汇(#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
找出词汇中是否存在单词和索引的最有效方法是什么?
我可以简单地使用列表/数组并比较字符串,但这没有利用词汇的字母排序
答案 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 set
或dictionary.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保留在幕后,并且该更新用于此类查找。