我在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)
如何修复上述代码?
答案 0 :(得分:5)
missedString
是列表
请注意,您可以在几个地方简化代码
missedString = []
for a in missed:
missedString.append(a.getName())
可以用列表理解替换
missedString = [a.getName() for a in missed]
在这里,您应该使用split
的{{1}}方法,而不是recall
)。看起来这个循环应该嵌套在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)
答案 1 :(得分:0)
在此代码中
for j in string.split(recall, ','):
if j in missedString:
missedString.remove(j)
continue
尝试添加
else:
print 'Didn't remove "%s"' % j
(摆脱continue
。它没有任何目的。)
您可能错过了拆分中的一些空格。如果是这种情况,请添加j = j.strip()
或使用re.split(r'\s*,\s*', recall)
代替string.split(recall, ',')
。