我在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())


这是我无法迭代的循环。第一个for循环仅在拆分字符串列表中经历j的第一次迭代,然后将其从missedString中删除​​。我希望将拆分字符串recall的所有成员从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)


如何解决以上代码?

最佳答案

missedString是列表的可怕名称

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

        missedString = []
        for a in missed:
            missedString.append(a.getName())


可以由列表理解代替

        missedString = [a.getName() for a in missed]


在这里,您应该只使用splitrecall方法而不是string.split)。看起来该循环应该嵌套在for i循环内,所以我假设是这样(如果不是,则将在错误的数据集上使用错误的召回值)。

for j in string.split(recall, ','):
    if j in missedString:
        missedString.remove(j)
        continue


也可以用列表理解代替它。

recall_set = set(recall.split(','))
missedString = [j for j in missedString if j not in recall_set]


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

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


这个循环有一个严重的问题。通常,从要迭代的列表中删除元素不是一个好主意。您最终将跳过某些元素而无需检查它们

for b in missed:
    if b.getName() not in missedString:
        missed.remove(b)


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

missed = [b for b in missed if b.getName() in missedString]

09-06 01:39