如何在while循环中使用for循环? 这是我的代码:
def avoids(word,forbidden):
for fl in forbidden:
for letter in word:
if letter == fl:
return False
return True
fin= open('words.txt')
u=97
v=97
w=97
x=97
y=97
minim=100
while u <= 122:
while v <= 122:
while w <= 122:
while x <= 122:
while y <= 122:
count=0
for line in fin:
word = line.strip()
if avoids(word,chr(u)+chr(v)+chr(w)+chr(x)+chr(y)):
#print(word)
count+=1
#print((100/113809)*count)
if (100/113809)*count<minim:
print(count)
minim=(100/113809)*count
print(minim,chr(u)+chr(v)+chr(w)+chr(x)+chr(y))
y+=1
y=97
x+=1
x=97
w+=1
w=97
v+=1
v=97
u+=1
它只执行一次for循环。 我可以把fin = open('words.txt')放在最新的while语句中,但是程序变得很慢&amp;几乎无法使用。 我该怎么办?(不是我不想使用列表和等等)
答案 0 :(得分:5)
它执行for循环一次的原因是你在for循环的第一次迭代期间耗尽了为“words.txt”文件创建的缓冲区。
如果您想多次浏览该文件中的单词,则需要每次重新打开它(正如您所指出的那样,会产生大量开销)。
或者,将该文件读入列表,然后运行列出的while / for-loop结构。
即
fin= open('words.txt')
wordList = fin.readlines()
u=97
v=97
...
for line in wordList
...
答案 1 :(得分:1)
你的代码看起来会像这样缩小:
from string import ascii_lowercase
from itertools import product
for u, v, w, x, y in product(ascii_lowercase, repeat=5):
...
我不确定avoids()
函数应该做什么。它目前的形式不太可能有用。你有没有测试过它?
也许你的意图是这样的
def avoids(word, forbidden):
for fl, letter in zip(forbidden, word):
if letter == fl:
return False
return True
但很难想象这会有多大用处。逻辑似乎仍然是错误的
答案 2 :(得分:0)
您可以比文件更快地检查列表中的单词,因为它会跳过读取和写入开销。可以使用list comprehension快速填写此列表。
import string
chars = string.uppercase
word_list = [''.join((a,b,c,d,e)) for a in chars for b in chars for c in chars
for d in chars for e in chars]
'dkbke'.upper() in word_list
>>> True
你可以拿出其余部分,因为我不确定你想用它做什么。
编辑:正如gnibbler刚刚教我,上面的内容并缩短使用
from itertools import product
from string import uppercase as chars
words = [''.join((a,b,c,d,e)) for a, b, c, d, e in product(chars, repeat=5)]
'dkbke'.upper() in words
>>> True
注意:至于您不熟悉的学习内容,请尝试使用__doc__
来学习或只是使用它。例如:
product.__doc__
>>> product(*iterables) --> product object
Cartesian product of input iterables.
Equivalent to nested for-loops.
For example, product(A, B) returns the same as:
((x,y) for x in A for y in B).
The leftmost iterators are in the outermost for-loop, so the output tuples
cycle in a manner similar to an odometer (with the rightmost element changing
on every iteration).
To compute the product of an iterable with itself,
specify the number of repetitions with the optional repeat keyword argument.
For example,
product(A, repeat=4) means the same as product(A, A, A, A).
product('ab', range(3)) --> ('a',0) ('a',1) ('a',2) ('b',0) ('b',1) ('b',2)
product((0,1), (0,1), (0,1)) --> (0,0,0) (0,0,1) (0,1,0) (0,1,1) (1,0,0) ...
''.join.__doc__
>>> S.join(iterable) -> string
Return a string which is the concatenation of the strings in the
iterable. The separator between elements is S.
''.join(['a','b','c'])
>>> 'abc'
'-'.join(['a','b','c'])
>>> 'a-b-c'