如何删除字符串中 x 个字符的 1 个实例并找到它在 Python3 中组成的单词?
How do I remove 1 instance of x characters in a string and find the word it makes in Python3?
这是我目前所拥有的,但我被卡住了。我正在使用 nltk 作为单词列表,并试图找到所有包含 "sand" 中字母的单词。我想从这个列表中找到我可以用剩余字母组成的所有单词。
import nltk.corpus.words.words()
pwordlist = []
for w in wordlist:
if 's' in w:
if 'a' in w:
if 'n' in w:
if 'd' in w:
pwordlist.append(w)
在这种情况下,我必须使用所有字母来找到可能的单词。
我认为这将有助于找到剩余字母的可能单词,但我不知道如何只删除 'sand'.
中的 1 个字母实例
puzzle_letters = nltk.FreqDist(x)
[w for w in pwordlist if len(w) = len(pwordlist) and nltk.FreqDist(w) = puzzle_letters]
我会将逻辑分为四个部分:
- 一个函数
contains(word, letters)
,我们将使用它来检测单词是否包含“sand”
- 一个函数
subtract(word, letters)
,我们将使用它从单词中删除“sand”。
- 一个函数
get_anagrams(word)
,它可以找到一个单词的所有变位词。
- 结合上述所有内容的主要算法,在您删除“sand”后查找与其他词的变位词。
from collections import Counter
words = ??? #todo: somehow get a list of every English word.
def contains(word, letters):
return not Counter(letters) - Counter(word)
def subtract(word, letters):
remaining = Counter(word) - Counter(letters)
return "".join(remaining.elements())
anagrams = {}
for word in words:
base = "".join(sorted(word))
anagrams.setdefault(base, []).append(word)
def get_anagrams(word):
return anagrams.get("".join(sorted(word)), [])
for word in words:
if contains(word, "sand"):
reduced_word = subtract(word, "sand")
matches = get_anagrams(reduced_word)
if matches:
print word, matches
运行以上代码在Words With Friends词典上,得到了很多结果,包括:
...
cowhands ['chow']
credentials ['reticle', 'tiercel']
cyanids ['icy']
daftness ['efts', 'fest', 'fets']
dahoons ['oho', 'ooh']
daikons ['koi']
daintiness ['seniti']
daintinesses ['sienites']
dalapons ['opal']
dalesman ['alme', 'lame', 'male', 'meal']
...
节目:
from nltk.corpus import words
from collections import defaultdict
def norm(word):
return ''.join(sorted(word))
completers = defaultdict(list)
for word in words.words():
completers[norm(word + 'sand')].append(word)
for word in words.words():
comps = completers[norm(word)]
if comps:
print(word, comps)
输出:
...
admirableness ['miserable']
adnascent ['enact']
adroitness ['sorite', 'sortie', 'triose']
adscendent ['cedent', 'decent']
adsorption ['portio']
adventuress ['vesture']
adversant ['avert', 'tarve', 'taver', 'trave']
...
让我们来回答您的问题,而不是通过为您做整个练习来破坏乐趣:要仅删除字母的一个实例,请指定一个替换项并限制它应该应用的次数:
>>> "Frodo".replace("o", "", 1)
'Frdo'
或者如果您只需要应用一次正则表达式(虽然在这种情况下您不需要正则表达式):
>>> import re
>>> re.sub(r"[od]", "", "Frodo", 1)
'Frdo'
现在,如果您有一个字符串,其字母 (s, a, n, d) 要从单词中删除 word
,您可以简单地遍历该字符串:
>>> for letter in "sand":
word = word.replace(letter, "", word)
我会留给你将它嵌入一个遍历单词列表中所有单词的循环中,并利用剩余的字母。
这是我目前所拥有的,但我被卡住了。我正在使用 nltk 作为单词列表,并试图找到所有包含 "sand" 中字母的单词。我想从这个列表中找到我可以用剩余字母组成的所有单词。
import nltk.corpus.words.words()
pwordlist = []
for w in wordlist:
if 's' in w:
if 'a' in w:
if 'n' in w:
if 'd' in w:
pwordlist.append(w)
在这种情况下,我必须使用所有字母来找到可能的单词。 我认为这将有助于找到剩余字母的可能单词,但我不知道如何只删除 'sand'.
中的 1 个字母实例puzzle_letters = nltk.FreqDist(x)
[w for w in pwordlist if len(w) = len(pwordlist) and nltk.FreqDist(w) = puzzle_letters]
我会将逻辑分为四个部分:
- 一个函数
contains(word, letters)
,我们将使用它来检测单词是否包含“sand” - 一个函数
subtract(word, letters)
,我们将使用它从单词中删除“sand”。 - 一个函数
get_anagrams(word)
,它可以找到一个单词的所有变位词。 - 结合上述所有内容的主要算法,在您删除“sand”后查找与其他词的变位词。
from collections import Counter
words = ??? #todo: somehow get a list of every English word.
def contains(word, letters):
return not Counter(letters) - Counter(word)
def subtract(word, letters):
remaining = Counter(word) - Counter(letters)
return "".join(remaining.elements())
anagrams = {}
for word in words:
base = "".join(sorted(word))
anagrams.setdefault(base, []).append(word)
def get_anagrams(word):
return anagrams.get("".join(sorted(word)), [])
for word in words:
if contains(word, "sand"):
reduced_word = subtract(word, "sand")
matches = get_anagrams(reduced_word)
if matches:
print word, matches
运行以上代码在Words With Friends词典上,得到了很多结果,包括:
...
cowhands ['chow']
credentials ['reticle', 'tiercel']
cyanids ['icy']
daftness ['efts', 'fest', 'fets']
dahoons ['oho', 'ooh']
daikons ['koi']
daintiness ['seniti']
daintinesses ['sienites']
dalapons ['opal']
dalesman ['alme', 'lame', 'male', 'meal']
...
节目:
from nltk.corpus import words
from collections import defaultdict
def norm(word):
return ''.join(sorted(word))
completers = defaultdict(list)
for word in words.words():
completers[norm(word + 'sand')].append(word)
for word in words.words():
comps = completers[norm(word)]
if comps:
print(word, comps)
输出:
...
admirableness ['miserable']
adnascent ['enact']
adroitness ['sorite', 'sortie', 'triose']
adscendent ['cedent', 'decent']
adsorption ['portio']
adventuress ['vesture']
adversant ['avert', 'tarve', 'taver', 'trave']
...
让我们来回答您的问题,而不是通过为您做整个练习来破坏乐趣:要仅删除字母的一个实例,请指定一个替换项并限制它应该应用的次数:
>>> "Frodo".replace("o", "", 1)
'Frdo'
或者如果您只需要应用一次正则表达式(虽然在这种情况下您不需要正则表达式):
>>> import re
>>> re.sub(r"[od]", "", "Frodo", 1)
'Frdo'
现在,如果您有一个字符串,其字母 (s, a, n, d) 要从单词中删除 word
,您可以简单地遍历该字符串:
>>> for letter in "sand":
word = word.replace(letter, "", word)
我会留给你将它嵌入一个遍历单词列表中所有单词的循环中,并利用剩余的字母。