【问题标题】:Python strings with anagrams带有字谜的 Python 字符串
【发布时间】:2016-06-23 03:52:08
【问题描述】:

目前,此代码从用户那里获取一个字符串,并将其与存储了许多单词的文本文件进行比较。然后它输出包含与字符串完全匹配的所有单词。 (例如“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))     

【问题讨论】:

  • 您可能想要使用Counter,然后检查输入单词是否包含所有相同的字母 (a.keys() == b.keys()),以及每个字母的计数是否高于或相等 b[k] > v for k, v in a.items()。跨度>
  • 旁白:记住使用with时不需要close文件。

标签: python string anagram


【解决方案1】:

您必须编辑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 包中的 Counter:

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 &lt;= input_counter[key] for key, count in word_counter.items()) 检查word 的每个字母在user 中出现的次数是否至少与它们在word 中出现的次数相同。

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

【讨论】:

  • 谢谢大家。我使用了您的代码更改 bbkglb 但它仍然没有输出我需要的内容。我需要的是,例如,如果我输入“tpozxc”,程序会意识到其中有 3 个单词并输出“opt, top ,pot”,但发生的事情是它只输出与 a 中完全匹配的字符串重新排列顺序,所以要获得最佳选择和底池,我需要输入一个仅包含这些字母组合的字符串。
  • @CBren 哦,我明白了,我误解了你的问题;我编辑了这两个函数。这应该可以解决它。
猜你喜欢
  • 2016-06-24
  • 2020-10-28
  • 2021-12-12
  • 2017-05-03
  • 2014-04-13
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
相关资源
最近更新 更多