0
def gt(nums, n):

    for c in nums:
        if max(nums) > n:
            return True

        elif max(nums) < n:
            return False

        elif not nums:
            return False

最後の についてはelif、数値のリストが空かどうかを検証する必要があります。しかし、私のために働いていません。リストが空かどうかを確認するために使用できるコードを知っている人はいますか? ありがとう。

4

6 に答える 6

7

メソッドは次のように簡略化できます。

def gt(nums, n):
  return max(nums) > n if nums else False

>>> gt([],0)
False
>>> gt([1,2,3],6)
False
>>> gt([1,2,3],1)
True
于 2012-08-20T06:26:18.270 に答える
6

not nums最初に確認する必要があります。forそして、ループは必要ありません。

これは(あなたのコードのように) を明示的にチェックせず、この状況max(nums) == nで戻ることに注意してくださいFalse(これは と呼ばれる関数の正しい動作だと思いますgt()

def gt(nums, n):
    if not nums:
        return False
    return max(nums) > n

編集:いくつかのタイミング (Python 2.7.3):

>>> import timeit
>>> all = """l = list(range(100))
... rl = list(reversed(range(100)))
... """
>>> tim = all + """def gt(nums, n):
...     if not nums:
...         return False
...     return max(nums) > n"""
>>> gnibbler = all + """def gt(nums, n):
...     return any(x>n for x in nums)"""
>>> burhan = all + """def gt(nums, n):
...   return max(nums) > n if nums else False"""
>>> # Test with the condition being False:
... timeit.timeit(setup=tim, stmt="gt(l, 100)")
3.011574096311698
>>> timeit.timeit(setup=gnibbler, stmt="gt(l, 100)")
8.00847921677337
>>> timeit.timeit(setup=burhan, stmt="gt(l, 100)")
2.9805757305956178
>>> timeit.timeit(setup=tim, stmt="gt(rl, 100)")
2.8600606448831307
>>> timeit.timeit(setup=gnibbler, stmt="gt(l, 100)")
7.997938412127745
>>> timeit.timeit(setup=burhan, stmt="gt(l, 100)")
3.032805185133668
>>> # Now what if the condition is True?
... timeit.timeit(setup=tim, stmt="gt(l, 98)")
2.98623750798793
>>> timeit.timeit(setup=gnibbler, stmt="gt(l, 98)")
8.265056412191534
>>> timeit.timeit(setup=burhan, stmt="gt(l, 98)")
2.9731271156252888
>>> timeit.timeit(setup=tim, stmt="gt(rl, 98)")
2.8777295865334764
>>> timeit.timeit(setup=gnibbler, stmt="gt(rl, 98)")
1.0481696827076092
>>> timeit.timeit(setup=burhan, stmt="gt(rl, 98)")
2.8776150752220246

したがって、Burhan のソリューションと私のソリューションは速度の点で同等であり (まったく同じことを行うため、それほど驚くべきことではありません。私のソリューションはもう少し冗長です)、リストが十分に長い場合にのみ、gnibbler のソリューションの方が著しく高速です (以前のソリューションは削除しました)。リストに含まれる項目が 10 個しかない場合は常に遅くなるタイミング)、条件が に評価さTrue 、リストの非常に早い段階で検索値に到達します。そうしないと、すべての Python レベルの比較が大幅に遅くなります。

于 2012-08-20T06:21:29.440 に答える
4

max()numsは、最初または 2 番目の要素が より大きい場合でも、 の全体を強制的に検索しますnany()より大きい要素nが見つかるとすぐに戻ります

def gt(nums, n):
    return any(x>n for x in nums)

テストケース

>>> gt([],0)
False
>>> gt([1,2,3],6)
False
>>> gt([1,2,3],1)
True
于 2012-08-20T06:48:09.460 に答える
3

他の言語が配列 (リスト、タプル、または Python の他のシーケンス) をループする必要があることをmax関数と混同していると思います。

Python の Max() は、リストまたはシーケンスを取り、最大値を返します。注 - ループする必要はありません:

>>> max([1,2,3])
3
>>> l=[1,2,22]
>>> max(l)
22
>>> max('abc')
'c'

したがって、関数は次のように実行できます。

def gt(nums, n): 
    if nums and max(nums) > n:
        return True
    return False

または、 max が取り除かれた場合、またはこれのループを見たいだけの場合:

def gt(nums, n): 
    for num in nums:
        if num>n:
            return True   

    return False        

リストが空である場合は for ループが実行されないため、リストが空であることを確認する必要はありません。

考慮すべき最終的な形式は次のとおりです。

>>> nums=[1,5,5,1,5,1,1,1]
>>> n=2
>>> [i for i,x in enumerate(nums) if x>n]
[1, 2, 4]

これは、リスト内包表記と列挙を使用して n より大きい要素の nums の各要素のインデックスのリストです。

于 2012-08-20T06:29:51.983 に答える
1
>>> plist = []
>>> not plist
True

not list私のために働く

于 2012-08-20T06:20:13.290 に答える
-1

nums が空の場合、コントロールはループ内に入りません。したがって、そのチェックを無視できます (同じループ内で数値を変更する場合を除きますが、これはお勧めできません)。

ただし、質問に答えるには、次を使用します。

nums == []
于 2012-08-20T06:21:50.763 に答える