严重难以捉摸的循环(绞尽脑汁!)

use*_*359 1 python iteration for-loop python-2.7

我在Python 2.72中遇到了一个循环问题,这让我非常沮丧.基本上循环不是在第一个索引上迭代j,我已经尝试了各种方法来修复它而没有运气.

def learn(dataSet):
    for i in dataSet.getNext():
        recall = raw_input("Enter all members of %s you are able to recall >>> (separated by commas)  " % (i.getName()))
        missed = i.getMembers()     
        missedString = []       
        for a in missed:
            missedString.append(a.getName())    
Run Code Online (Sandbox Code Playgroud)

这是我无法迭代的循环.第一个for循环只经历j拆分字符串列表中的第一次迭代,然后从中删除它missedString.我希望recall删除split-string的所有成员missedString.

for j in string.split(recall, ','):
    if j in missedString:
        missedString.remove(j)
        continue
for b in missed:
    if b.getName() not in missedString:
        missed.remove(b)
print 'You missed %d.  ' % (len(missed))
if (len(missed)) > 0:
    print 'Maybe a hint or two will help...' 
    for miss in missed:
        remind(miss.getSecs(), i.getName(), missed)
Run Code Online (Sandbox Code Playgroud)

我该如何修复上面的代码?

Joh*_*ooy 5

missedString列表是一个可怕的名字

请注意,您可以在几个地方简化代码

        missedString = []       
        for a in missed:
            missedString.append(a.getName())    
Run Code Online (Sandbox Code Playgroud)

可以用列表理解代替

        missedString = [a.getName() for a in missed]
Run Code Online (Sandbox Code Playgroud)

在这里你应该使用代替的split方法.看起来这个循环应该嵌套在循环中,所以我假设它是(如果不是,你将使用错误的数据集使用错误的召回值).recallstring.splitfor i

for j in string.split(recall, ','):
    if j in missedString:
        missedString.remove(j)
        continue
Run Code Online (Sandbox Code Playgroud)

它也可以由列表理解代替.

recall_set = set(recall.split(','))
missedString = [j for j in missedString if j not in recall_set]
Run Code Online (Sandbox Code Playgroud)

如果例如,这将无法正常工作.用户在输入中输入额外的空格,因此strip()这些元素是个好主意

recall_set = set(s.strip() for s in recall.split(','))
missedString = [j for j in missedString if j not in recall_set]
Run Code Online (Sandbox Code Playgroud)

这个循环有一个严重的问题.一般来说,从迭代列表中删除元素并不是一个好主意.你最终会跳过一些元素而不检查它们

for b in missed:
    if b.getName() not in missedString:
        missed.remove(b)
Run Code Online (Sandbox Code Playgroud)

也许列表理解可以再次帮助

missed = [b for b in missed if b.getName() in missedString]
Run Code Online (Sandbox Code Playgroud)