【问题标题】:Seriously elusive for loop (racking my brains!)非常难以捉摸的 for 循环(绞尽脑汁!)
【发布时间】:2012-09-24 03:33:45
【问题描述】:

我在 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 中删除。我希望从missedString 中删除拆分字符串recall 的所有成员。

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)

如何修复上述代码?

【问题讨论】:

  • 输入recall时,逗号后面是否也输入了空格?
  • @WarrenWeckesser 我认为这不是问题,但这是我检查过的一件事

标签: python for-loop python-2.7 iteration


【解决方案1】:

missedString 对于列表

来说是个糟糕的名字

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

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

可以用列表推导替换

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

这里你应该只使用recallsplit 方法而不是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]

【讨论】:

  • 非常感谢,您的帖子非常有帮助。问题已解决,将来我会对列表推导感到更自在。
【解决方案2】:

在这段代码中

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, ',')

【讨论】:

  • 这有帮助!我没有考虑额外的空白,拆分是一个更好的选择。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多