for循环中的循环

时间:2013-06-28 13:27:13

标签: python python-3.x

如何在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;几乎无法使用。 我该怎么办?(不是我不想使用列表和等等)

3 个答案:

答案 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'