Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使python解读代码更高效?_Python_Itertools - Fatal编程技术网

如何使python解读代码更高效?

如何使python解读代码更高效?,python,itertools,Python,Itertools,我的代码 我使用它来解读单词,找到单词的所有可能排列,并将每个排列与字典进行比较,以找到真正的单词,然后返回那些真正的单词。然而,检查八个字母会导致一个错误,因为在程序完成之前我的内存就用完了,而有七个或八个字母的单词需要很长时间才能解读。我想知道是否有一种方法可以使我的代码能够在较长的单词中运行得更快,以及是否有一种方法可以增加最大单词长度。我使用的是Python 3,如果有必要的话,我是一个初学者。与其将所有排列添加到列表中,不如直接迭代它们 from itertools import pe

我的代码


我使用它来解读单词,找到单词的所有可能排列,并将每个排列与字典进行比较,以找到真正的单词,然后返回那些真正的单词。然而,检查八个字母会导致一个错误,因为在程序完成之前我的内存就用完了,而有七个或八个字母的单词需要很长时间才能解读。我想知道是否有一种方法可以使我的代码能够在较长的单词中运行得更快,以及是否有一种方法可以增加最大单词长度。我使用的是Python 3,如果有必要的话,我是一个初学者。

与其将所有排列添加到列表中,不如直接迭代它们

from itertools import permutations

original = str(input('What word would you like to unscramble?: '))

gen = []
for bob in permutations(original):
    gen.append(''.join(bob))



inputFile = open('dic.txt', 'r')
compare = inputFile.read().split('\n')
inputFile.close()

rondo = set(john for john in gen if john in compare)

for magic in rondo:
    print(magic)

找到解决方案的更好方法是创建一个单词的签名,或者创建一个从字母到计数的地图,或者对字母进行排序。然后,您只需要将加扰单词的签名与单词列表中的签名进行比较

set(john for john in (''.join(bob) for bob in permutations(original)) if john in compare)

您不应该将所有排列追加到列表中,而应该直接迭代它们

from itertools import permutations

original = str(input('What word would you like to unscramble?: '))

gen = []
for bob in permutations(original):
    gen.append(''.join(bob))



inputFile = open('dic.txt', 'r')
compare = inputFile.read().split('\n')
inputFile.close()

rondo = set(john for john in gen if john in compare)

for magic in rondo:
    print(magic)

找到解决方案的更好方法是创建一个单词的签名,或者创建一个从字母到计数的地图,或者对字母进行排序。然后,您只需要将加扰单词的签名与单词列表中的签名进行比较

set(john for john in (''.join(bob) for bob in permutations(original)) if john in compare)

您不应该将所有排列追加到列表中,而应该直接迭代它们

from itertools import permutations

original = str(input('What word would you like to unscramble?: '))

gen = []
for bob in permutations(original):
    gen.append(''.join(bob))



inputFile = open('dic.txt', 'r')
compare = inputFile.read().split('\n')
inputFile.close()

rondo = set(john for john in gen if john in compare)

for magic in rondo:
    print(magic)

找到解决方案的更好方法是创建一个单词的签名,或者创建一个从字母到计数的地图,或者对字母进行排序。然后,您只需要将加扰单词的签名与单词列表中的签名进行比较

set(john for john in (''.join(bob) for bob in permutations(original)) if john in compare)

您不应该将所有排列追加到列表中,而应该直接迭代它们

from itertools import permutations

original = str(input('What word would you like to unscramble?: '))

gen = []
for bob in permutations(original):
    gen.append(''.join(bob))



inputFile = open('dic.txt', 'r')
compare = inputFile.read().split('\n')
inputFile.close()

rondo = set(john for john in gen if john in compare)

for magic in rondo:
    print(magic)

找到解决方案的更好方法是创建一个单词的签名,或者创建一个从字母到计数的地图,或者对字母进行排序。然后,您只需要将加扰单词的签名与单词列表中的签名进行比较

set(john for john in (''.join(bob) for bob in permutations(original)) if john in compare)

您可以使用生成器而不是列表:

words = {}
for word in compare:
    key = ''.join(sorted(word))
    if key in words:
        words[key].add(word)
    else:
        words[key] = {word}

return words[''.join(sorted(original))]
这将节省内存使用

关于生成器的使用与列表理解,这里有一个很好的讨论:


这里还有另一个很好的讨论:

您可以使用生成器而不是列表:

words = {}
for word in compare:
    key = ''.join(sorted(word))
    if key in words:
        words[key].add(word)
    else:
        words[key] = {word}

return words[''.join(sorted(original))]
这将节省内存使用

关于生成器的使用与列表理解,这里有一个很好的讨论:


这里还有另一个很好的讨论:

您可以使用生成器而不是列表:

words = {}
for word in compare:
    key = ''.join(sorted(word))
    if key in words:
        words[key].add(word)
    else:
        words[key] = {word}

return words[''.join(sorted(original))]
这将节省内存使用

关于生成器的使用与列表理解,这里有一个很好的讨论:


这里还有另一个很好的讨论:

您可以使用生成器而不是列表:

words = {}
for word in compare:
    key = ''.join(sorted(word))
    if key in words:
        words[key].add(word)
    else:
        words[key] = {word}

return words[''.join(sorted(original))]
这将节省内存使用

关于生成器的使用与列表理解,这里有一个很好的讨论:


这里还有一个很好的讨论:

谢谢!我明白你的意思,但你能不能给我一个演示,因为我不太清楚怎么做。你可以把这些信按如下顺序排列,然后签名。扫描每行有一个单词的当前词典文件,并创建一个每行有两个单词的新文件:按字母顺序排列的原始单词,然后是原始单词。然后,要解读一个单词,只需对其进行排序,然后在新文件中搜索排序后的版本。您可以将新的双单词列表作为Python
dict
存储在内存中,排序后的单词作为键,原始版本作为值。如果没有,您可以使用二分法快速搜索已排序的文件。这很好,但根据我的回答,我仍然建议提问者理解并使用代码中的生成器。@CaptainWhippet我也在我的答案中包含了您的答案。但是,我没有把它清楚地分开,这就是你可能错过它的原因。谢谢!我明白你的意思,但你能不能给我一个演示,因为我不太清楚怎么做。你可以把这些信按如下顺序排列,然后签名。扫描每行有一个单词的当前词典文件,并创建一个每行有两个单词的新文件:按字母顺序排列的原始单词,然后是原始单词。然后,要解读一个单词,只需对其进行排序,然后在新文件中搜索排序后的版本。您可以将新的双单词列表作为Python
dict
存储在内存中,排序后的单词作为键,原始版本作为值。如果没有,您可以使用二分法快速搜索已排序的文件。这很好,但根据我的回答,我仍然建议提问者理解并使用代码中的生成器。@CaptainWhippet我也在我的答案中包含了您的答案。但是,我没有把它清楚地分开,这就是你可能错过它的原因。谢谢!我明白你的意思,但你能不能给我一个演示,因为我不太清楚怎么做。你可以把这些信按如下顺序排列,然后签名。扫描每行有一个单词的当前词典文件,并创建一个每行有两个单词的新文件:按字母顺序排列的原始单词,然后是原始单词。然后,要解读一个单词,只需对其进行排序,然后在新文件中搜索排序后的版本。您可以将新的双单词列表作为Python
dict
存储在内存中,排序后的单词作为键,原始版本作为值。如果没有,您可以使用二分法快速搜索已排序的文件