1

Python 2.72 にループの問題があり、本当にイライラしています。基本的に、ループは最初の indexjで繰り返されていません。私はそれを修正するためにあらゆる種類の方法を試しましたが、うまくいきませんでした。

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)

上記のコードを修正するにはどうすればよいですか?

4

2 に答える 2

5

missedStringリストのひどい名前です

いくつかの場所でコードを単純化できることに注意してください

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

リスト内包表記に置き換えることができます

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

ここでは、の代わりにのsplitメソッドを使用する必要があります)。このループはループ内にネストされているように見えるので、ネストされていると想定します(そうでない場合は、間違ったデータセットで間違ったリコール値を使用することになります)。recallstring.splitfor 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]
于 2012-09-24T04:26:07.040 に答える
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, ',')

于 2012-09-24T04:29:07.023 に答える