获取只有一个字母差异的单词列表的更简单方法?(python)
给定一个单词和一个字符串列表,我想检索与给定的获取只有一个字母差异的单词列表的更简单方法?(python),python,Python,给定一个单词和一个字符串列表,我想检索与给定的单词只有一个不同字符的字符串列表 我尝试了上面的代码,效果很好,但时间太长了 我正在练习面试,我不喜欢使用任何图书馆 我怎样才能使它更简单 (示例) word=“lost” wordList=[“大多数”、“薄雾”、“错过”、“丢失”、“拳头”、“鱼”] 输出应该是['most'] 编辑:仅更改1个字符有效。不删除或添加。复杂性将保持不变,但也许您可以在列表中使用sum来加速它: words = [] for w in wordList:
单词
只有一个不同字符的字符串列表
我尝试了上面的代码,效果很好,但时间太长了
我正在练习面试,我不喜欢使用任何图书馆 我怎样才能使它更简单 (示例)
word=“lost”
wordList=[“大多数”、“薄雾”、“错过”、“丢失”、“拳头”、“鱼”]
输出应该是['most']
编辑:仅更改1个字符有效。不删除或添加。复杂性将保持不变,但也许您可以在列表中使用
sum
来加速它:
words = []
for w in wordList:
wcnt = 0
for i in range(len(word)):
if w[i] != word[i]:
wcnt += 1
if wcnt == 1:
words.append(w)
通过直接交错字母并进行一对一比较,避免了使用索引zip
避免在python中进行本机计数(表达式交错两个单词的字母,如果不同则加1,否则为0,比较结果为sum
或True
,分别值为1和0)False
- 列表理解是高度优化的python构造
- 上面的代码不使用任何外部库,只使用内置库
- 它不会与
崩溃,即使单词的长度不同(即使结果不可靠),因为索引器
在较短的序列结束时停止zip
- 单行线很酷(不太牵强/有副作用时)
因此,您使用的内置设备越多,通常速度就越快。在这里,如果不同字母的数量达到2,可能会稍微改进停止计数,但这意味着停止使用理解。使用内置库(
difflib
)怎么样
使用
您可以通过自然语言工具包在python中直接使用它:
from difflib import SequenceMatcher
word = "lost"
wordList= ["most", "mist", "miss", "lost", "fist", "fish"]
>>> [x for x in wordList
if SequenceMatcher(None, word, x).ratio() == (len(word) - 1) / float(len(word))]
['most']
这将返回1,因为单词的距离是1,这意味着一个字母是不同的。不同的意思是“更改为另一个字符”,对吗?因此,
last
和blast
不会被一个字符关闭,sap
和asp
@Dawn17那么ABCD和BXCD、sap和PAS、sap和asp呢?你能回答这3个输入吗?提供的代码(OP说它有效)暗示角色只能与他们当前的职位进行比较。“我正在练习面试,我不喜欢使用任何库。”。不过,对于那些不练习面试的人来说,这是一个很好的答案。谢谢。这很有帮助。当阈值为1时,您不需要停止使用理解:如果有的话(a!=b…
是的,但我的答案中已经有了这一点:“sum避免在python中以本机方式计数(表达式将两个单词的字母交织在一起,如果不同则加1,否则为0,比较结果分别为值1和0的True或False)”。还有什么需要进一步澄清的吗?@Jean-Françoisfare为了支持不同长度的单词,我会使用len(word)==len(w)和sum(a!=b表示a,b在zip(word,w))==1
。和
如果某些单词的长度不同,那么短接甚至可能会加快速度,而不是DV,但OP说:“只更改1个字符有效。不删除或添加。”Levenshtein距离计算插入和删除。
from difflib import SequenceMatcher
word = "lost"
wordList= ["most", "mist", "miss", "lost", "fist", "fish"]
>>> [x for x in wordList
if SequenceMatcher(None, word, x).ratio() == (len(word) - 1) / float(len(word))]
['most']
import nltk
nltk.edit_distance('asdff','asdfe')