2
#iterative program to find the highest odd number
m = sorted([a, b, c, d, e, f, g, h, j, k])
n = max(m)
n = int(n)
count = 10
while n%2==0:
    m=[m[:-1]]
    n = max(m)
    n = int(n)
    count =-1
if count==0:
    print 'There are no odd numbers'
else:
    print str(n), 'is the largest odd number'

奇数を含む変数を入力すると正しい答えが得られますが、'count==0'条件を満たすようにすべての偶数を入力すると、次のエラーが発生します。

TypeError: int() 引数は、'list' ではなく、文字列または数値でなければなりません

奇数を入力してもこのエラーが発生しない理由がわかりません。

4

3 に答える 3

3

ループの内部を印刷するmと、これはかなり明白になります。または、対話型ビジュアライザーまたはデバッガーのみを使用してテストすることもできます。

あなたの値が であるとしましょう2, 4, 6, 8, 10, 12, 14, 16, 18, 20。並べ替えると、次のようになります。

m = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
n = max(m) = 20
n = int(n) = 20

並べ替えの定義により、リストの最後の値でなければならないため、これmaxは役に立ちません(とにかくループでそれに依存しているようです)。

また、intは誤解を招きます。数値が数値ではなく文字列であってもコードが機能するように見えますが、実際には機能sortedしません。max'10''2'

しかし、どちらもあなたの大きな問題ではありません。最初nは偶数なので、ループに入ります。ループの最初のことは次のとおりです。

m=[m[:-1]]

…これを行う:

m = [[2, 4, 6, 8, 10, 12, 14, 16, 18]]

したがって、次の 2 行でこれを行います。

n = [2, 4, 6, 8, 10, 12, 14, 16, 18] # the max of a 1-element list is that element
n = int([2, 4, 6, 8, 10, 12, 14, 16, 18])

そしてブーム、あなたの例外があります。

mの最後の要素以外のすべてに設定したい場合はm、単にm = m[:-1]. それらの余分な括弧をその周りに投げると、 の最後の要素を除くすべての要素からなるリストである 1 つの要素からなる に設定mされます。listm

説明で「奇数を含む変数を入力すると、正しい答えが得られます」と言っているにもかかわらず、それは真実ではないことに注意してください。最大値が奇数の場合にのみ機能するため、最初からループに入ることはありません。

これを修正した後もコードは実際にはまだ壊れていますが、これで自分でデバッグする方法がわかったと思います。


一方、これを解決するためのPython的な方法は、高レベルの英語の説明を高レベルのPythonに直接翻訳しようとすることです. で最大の奇数を見つけるにはどうすればよいmですか?

最初に の奇数を取得しますm

odds = (n for n in m if n % 2)

(関数を作成すると、これはより読みやすくなる可能性がありますodd。また、その場合はfilter、ジェネレーター式を使用することをお勧めします。)

次に、最大値を取得するには:

max_odd = max(odds)

もちろん、オッズがない場合を処理する必要があります。にチェックを入れることでできますif odd:。しかし、Python では、通常、許可よりも許しを求めるほうがよいため、プログラム全体を次に示します。

m = [a, b, c, d, e, f, g, h, j, k]
odds = (n for n in m if n % 2)
try:
    print max(odds), 'is the largest odd number'
except ValueError:
    print 'There are no odd numbers'
于 2013-03-25T21:22:13.593 に答える
0

m=[m[::-1]]@abarnert が指摘したように、エラーは で発生します。

リスト内の最大奇数を見つける簡単な方法を次に示します。

m = sorted([int(n) for n in [a, b, c, d, e, f, g, h, j, k] if n%2==1])
# this makes a list of all ODD integers (converts them from strings)
if len(m) != 0:
    print str(max(m)), 'is the largest odd number'
else:
    print 'No odd integers inputted'

さらに単純化すると、次のようになります。

m = sorted([int(n) for n in [a, b, c, d, e, f, g, h, j, k] if n%2==1])
print (str(max(m)), 'is the largest odd number') if len(m)!=0 else 'No odd integers inputted'
于 2013-03-25T21:41:14.697 に答える
-3

偶数しかない場合、完全に人口を減らしたときに while ループがこのエラーを生成していますm。その場合、 をmax(m)返しますがNone、これは の引数にはなりませんint。これを修正するには、while ループの条件をより正確なものに変更する必要があります。

ただし、これはほとんどの人が「pythonic」と見なすものではありません。理想的には、逆の順序for n in m[::-1]でトラバースするようなループを使用します(または、 andの引数のみを使用します。)mreverse=Truesortedfor n in m

于 2013-03-25T21:15:41.570 に答える