0

私はpython初心者で、いくつかの練習をしているときに問題が発生しました。

以下は、これまでに取得したコードです。

def gt(nums, n):
    for c in nums:
        if n < c:
            return True
        elif c < n:
            return False
        else:
            break 

上記のコードでは、正しく返されません。正解の例は次のとおりです。

gt([1,2,3],3) => False
gt([1,2,3],2) => True
4

4 に答える 4

7

A simpler and more readable solution would be the following:

def gt(lst, n):
    return max(lst) > n
于 2012-08-19T13:20:22.657 に答える
4

ワンライナーを使って

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

これは、n より大きい最初の要素が見つかったときに壊れます。

于 2012-08-19T13:21:11.000 に答える
1

Niklas B. のコメントに対する長い応答:

これをテストすることにしました。結果は次のとおりです。青い点はあなたの機能、緑はマリオの機能です。y 軸は秒単位のランタイム、x 軸は len(数値) です。 ここに画像の説明を入力

あなたが言ったように、どちらもO(n)です。あなたのものは、約 45 個のアイテムまで高速です。100 を超えるアイテムの場合、彼は約 2 倍の速さです。

それはほとんど無関係です-これは何よりも初心者の構文の質問のようです-そして、あなたが言うように、Pythonはそもそもスピードの悪魔ではありません. 一方で、(読みやすさが損なわれない限り) もう少しスピードを上げたくない人はいますか?

興味のある方のために、これをテストするために私が書いたコードを次に示します。

from random import randint
from timeit import Timer
import matplotlib.pyplot as plt

def gt1(nums, n):
    # based on Niklas B.'s answer - NOTE comparison is corrected
    return n < max(nums)

def gt2(nums, n):
    # based on Mario Fernandez's answer
    return any(e > n for e in nums)

def make_data(length, lo=0, hi=None):
    if hi is None:
        hi = lo + length - 1
    elif lo > hi:
        lo,hi = hi,lo
    return [randint(lo, hi) for i in xrange(length)]

def make_args(d):
    nums = make_data(d)
    n = randint(0,d)
    return "{}, {}".format(nums, n)

def time_functions(fns, domain, make_args, reps=10, number=10):
    fns = [fn.__name__ if callable(fn) else fn for fn in fns]
    data = [[] for fn in fns]
    for d in domain:
        for r in xrange(reps):
            args = make_args(d)
            for i,fn in enumerate(fns):
                timer = Timer(
                    setup='from __main__ import {}'.format(fn),
                    stmt='{}({})'.format(fn, make_args(d))
                )
                data[i].extend((d,res) for res in timer.repeat(number=number))
    return data

def plot_data(data, formats=None):
    fig = plt.figure()
    ax = fig.add_subplot(111)
    if formats is None:
        for d in data:
            ax.plot([x for x,y in d], [y for x,y in d])
    else:
        for d,f in zip(data, formats):
            ax.plot([x for x,y in d], [y for x,y in d], f)
    plt.show()

def main():
    data = time_functions([gt1, gt2], xrange(10, 501, 10), make_args)
    plot_data(data, ['bo', 'g.'])

if __name__=="__main__":
    main()
于 2012-08-19T15:02:46.983 に答える
0

This could be better

def gt(nums, n):
    for c in nums:
       if n < c:
            return True

    return False
于 2012-08-19T13:19:45.487 に答える