1

私は自分の本で問題を起こそうとしていますが、どうすればいいのかわかりません。問題は、整数のリストを入力として受け取り、リスト内の整数が等比数列を形成する場合にTrueを返す関数geometric()を作成することです。シーケンスa0、a1、a2、a3、a4、...、an-2、an-1は、比率a1 / a0、a2 / a1、a3 / a2、a4 / a3、...、 an-1/an-2はすべて等しい。

def geometric(l):
for i in l:
    if i*1==i*0:
        return True
else:
    return False

正直なところ、これをどうやって始めたらいいのかわからず、完全に空白を描いています。どんな助けでもいただければ幸いです。

ありがとう!

例えば:

geometric([2,4,8,16,32,64,128,256])
>>> True

geometric([2,4,6,8])`
>>> False
4

4 に答える 4

3

これは、反復可能なすべてのオブジェクトを効率的に処理する必要があります。

from itertools import izip, islice, tee

def geometric(obj):
    obj1, obj2 = tee(obj)
    it1, it2 = tee(float(x) / y for x, y in izip(obj1, islice(obj2, 1, None)))
    return all(x == y for x, y in izip(it1, islice(it2, 1, None)))

assert geometric([2,4,8,16,32,64,128,256])
assert not geometric([2,4,6,8])

itertools をチェックしてください - http://docs.python.org/2/library/itertools.html

于 2013-02-25T07:31:36.923 に答える
1

これが私の解決策です。これは基本的にpyrospadeのitertoolsコードと同じですが、ジェネレーターが分解されています。ボーナスとして、除算を行わないようにすることで、純粋に整数の数学に固執することができます(理論的には、浮動小数点の丸めの問題が発生する可能性があります)。

def geometric(iterable):
    it = iter(iterable)
    try:
        a = next(it)
        b = next(it)
        if a == 0 or b == 0:
            return False
        c = next(it)
        while True:
            if a*c != b*b: # <=> a/b != b/c, but uses only int values
                return False
            a, b, c = b, c, next(it)
    except StopIteration:
        return True

いくつかのテスト結果:

>>> geometric([2,4,8,16,32])
True
>>> geometric([2,4,6,8,10])
False
>>> geometric([3,6,12,24])
True
>>> geometric(range(1, 1000000000)) # only iterates up to 3 before exiting
False
>>> geometric(1000**n for n in range(1000)) # very big numbers are supported
True
>>> geometric([0,0,0]) # this one will probably break every other code
False
于 2013-02-25T08:53:02.313 に答える
1

1 つの簡単な方法は次のようになります。

デフォルト is_geometric(a):
    r = a[1]/float(a[0])
    return all(a[i]/float(a[i-1]) == r for i in xrange(2,len(a)))

基本的に、最初の 2 つの比率を計算しall、ジェネレーターのすべてのメンバーが true かどうかを判断するために使用します。ジェネレーターの各メンバーは、2 つの数値の比率が最初の 2 つの数値の比率と等しいかどうかを表すブール値です。

于 2013-02-25T07:31:25.250 に答える
0

このような

def is_geometric(l):
    if len(l) <= 1: # Edge case for small lists
        return True
    ratio = l[1]/float(l[0]) # Calculate ratio
    for i in range(1, len(l)): # Check that all remaining have the same ratio
        if l[i]/float(l[i-1]) != ratio: # Return False if not
            return False
    return True # Return True if all did

そしてより冒険的な方へ

def is_geometric(l):
    if len(l) <= 1:
        return True
    r = l[1]/float(l[0])
    # Check if all the following ratios for each
    # element divided the previous are equal to r
    # Note that i is 0 to n-1 while e is l[1] to l[n-1]
    return all(True if e/float(l[i]) == r else False for (i, e) in enumerate(l[1:]))
于 2013-02-25T07:14:07.807 に答える