0

私はPythonを初めて使用し、宿題の問題で問題を抱えています。宿題の質問は次のとおりです。

インタージャーの2次元リストを取得し、テーブルの各行の合計が偶数の場合はTrueを返し、それ以外の場合(つまり、一部の行の合計が奇数の場合)を返す関数evenrow()を実装します。

結果は次のようになります。

evenrow([[1,3], [2,4], [0,6]])

True

evenrow([[1,3], [3,4], [0,5]])

False

現在の私の関数は次のようになります。

def evenrow(lst):
    mysum = 0
    for i in lst:
        mysum += sum(i)
        if mysum % 2 == 0:
            return True
        else:
            if mysum %2 ==1:
                return False

何らかの理由で、私の関数は、何を入力してもTrueを返し続けます。見落としているものはありますか?ヒントをいただければ幸いです。

4

3 に答える 3

5

偶数関数の奇数のみをチェックして短絡し、最後に true を返します

def even2d(list2d):
   for sub_list in list2d:
       if sum(sub_list)%2 == 1:
           return False
   return True

奇数をチェックするための逆

于 2013-03-08T00:48:27.267 に答える
3

Joran Beasley の答えが現在の知識レベルに最も適していると思いますが、問題を解決するためのより Pythonic で高次の方法を見る価値があります。

def even2d(list2d):
    return all(sum(row) % 2 == 0 for row in list2d)

すぐには理解できないかもしれませんが、説明できると思います。

まず、関数は、シーケンス内のすべての値が true の場合にall戻ります。Trueこれは非常に明白です。さらに、「後ろ向きに考える」(「1 つの行が奇数でない限り、すべての行は偶数である」) 必要がなくなります。トリックは、その真ん中の表現はどのようなシーケンスですか?

まず、一連の行の合計を取得するにはどうすればよいでしょうか?

row_sums = []
for row in list2d:
    row_sum = sum(row)
    row_sums.append(row_sum)

Python では、リスト内包表記でこのパターンを省略できます。

row_sums = [sum(row) for row in list2d]

そしてもちろん、その式sum(row)は次のようにもっと複雑なものになる可能性がありますsum(row) % 2 == 0

row_evens = [sum(row) % 2 == 0 for row in list2d]

そう:

def even2d(list2d):
    row_evens = [sum(row) % 2 == 0 for row in list2d]
    return all(row_evens)

これでほぼ完了ですが、必要になるまで値が計算されない一種の「遅延リスト」を提供するジェネレーター式を使用して、さらに改善することができます。角かっこをかっこに変えるだけです。

def even2d(list2d):
    row_evens = (sum(row) % 2 == 0 for row in list2d)
    return all(row_evens)
于 2013-03-08T01:01:12.997 に答える
2

メソッドから抜けたらreturn、ループを「戻る」ことはできません。代わりに、False奇数行を見つけたら、それ以上行をチェックする必要がないため、戻る必要があります。それ以外の場合、すべての行を調べても奇数が見つからない場合は、それらがすべて偶数であり、 を返すことができることがわかりますTrue

def evenrow(lst):
    for i in lst:
        if sum(i) % 2 == 1:
            return False
    return True

または、生意気な場合は、この非常に短いリスト内包表記バージョンがどのように機能するかを理解できるかどうかを確認してください。

def evenrow(lst):
    return not len([x for x in lst if sum(x) % 2])
于 2013-03-08T00:52:24.247 に答える