获取只有一个字母差异的单词列表的更简单方法?(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
    通过直接交错字母并进行一对一比较,避免了使用索引
  • sum
    避免在python中进行本机计数(表达式交错两个单词的字母,如果不同则加1,否则为0,比较结果为
    True
    False
    ,分别值为1和0)
  • 列表理解是高度优化的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')