带有字谜的 Python 字符串

标签 python string anagram

目前,此代码从用户处获取一个字符串,并将其与存储许多单词的文本文件进行比较。然后,它输出包含与该字符串完全匹配的所有单词。 (例如“otp = opt,top,pot)当前,当我输入字符串时,它仅将字符串与重新排列顺序中具有完全相同字母的单词进行匹配。

我的问题是如何才能输入多余的字母但仍输出包含的所有单词?例如:输入“orkignwer”,即使有多余的字母,程序也会输出“working”。

words = []


def isAnAnagram(word, user):
    wordList= list(word)
    wordList.sort()
    inputList= list(user)
    inputList.sort()
    return (wordList == inputList)

def getAnagrams(user):
    lister = [word for word in words if len(word) == len(user) ]
    for item in lister:
        if isAnAnagram(item, user):
            yield item


with open('Dictionary.txt', 'r') as f:
    allwords = f.readlines()
f.close()

for x in allwords:
    x = x.rstrip()
    words.append(x)
inp = 1


while inp != "99":
    inp = input("enter word:")
    result = getAnagrams(inp)
    print(list(result))     

最佳答案

您必须编辑 isAnAnagramgetAnagrams功能。首先是getAnagrams应编辑函数以在 lister 中包含更长的单词。列表:

def getAnagrams(user):
    lister = [word for word in words if len(word) <= len(user) ]
    for item in lister:
        if isAnAnagram(item, user):
            yield item

然后您需要编辑 isAnAnagram功能。正如 Alexander Huszagh 指出的,您可以使用 collections 中的计数器。封装:

from collections import Counter

def isAnAnagram(word, user):
    word_counter = Counter(word)
    input_counter = Counter(user)
    return all(count <= input_counter[key] for key, count in word_counter.items())

all(count <= input_counter[key] for key, count in word_counter.items())检查 word 的每个字母是否出现在 user至少与word中的次数一样多.

附注如果您想要更优化的解决方案,您可能需要查看 TRIE(例如 MARISA-trie、python-trie 或 PyTrie)。

关于带有字谜的 Python 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35880298/

相关文章:

python - 通过列名和工作表名称获取列数据

python - 故障排除引发 TypeError ("quote_from_bytes() expected bytes")

c# - 如何在纯 C# 和 .Net 框架中编写 Anagram 生成器

Java 程序接受输入单词并输出在导入的 .txt 文件中找到的任何字谜?

python - 为什么在打印时将列表附加到自身显示 [...] ?

python - 在 Pandas 中屏蔽工作日的特定时间段

C++ L"whatever"-> wstring -> basic_string<T>

php - 字符串解析帮助

java - Long.parseLong(String s) 和 new Long(String s) 的区别?

Objective-C 乱码求解器