-1

今日テストを行い、質問の1つを尋ねました。整数のリストを入力として受け取り、リスト内の前の整数のちょうど2倍の整数を1行に1つずつ出力する関数doubles()を記述します。

私のコードがこれをどのように正確に行うのか理解できませんでした

def doubles(x):
    for a in range(len(x)-1):
        for b in (range(a,len(x))):
            if x[a]*2==x[b]:
                print(b)

たとえば、doubles([3,0,1,2,3,6,2,4,5,6,5])は、2、6、4を出力します。

誰かが私がこれを行う方法を理解するのを手伝ってもらえますか?

4

6 に答える 6

1

最も簡単なアプローチは、1つの要素シフトで圧縮し、要素のペアの状態を確認することです。

>>> def doubles(x):
    return [b for a,b in zip(x,x[1:]) if b == 2*a]

>>> for e in doubles([3,0,1,2,3,6,2,4,5,6,5]):
    print e


2
6
4

同様のソリューションですが、イテレータを使用するだけです

>>> def doubles(x):
    it1, it2 = tee(x)
    next(it2)
    return [b for a,b in izip(it1,it2) if b == 2*a]

>>> for e in doubles([3,0,1,2,3,6,2,4,5,6,5]):
    print e


2
6
4
于 2013-03-20T19:35:29.300 に答える
1

あなたのコードは、各値をリストの後半に表示されるすべての値と比較することです。ただし、この質問では、隣接するペアのみを考慮するよう求めています。

そのため、リストを 1 回だけ歩く必要があります。このような:

def doubles(x):
    for i in range(1, len(x)):
        if x[i] == 2*x[i-1]:
            print x[i]

さらに、コードは値ではなくインデックスを出力しました。これは、上記で修正した障害です。

于 2013-03-20T19:27:54.167 に答える
1

リストを 1 回調べて、各要素をその次または前の要素でテストするだけで済みます。

以下の例では、各数値をその次の数値でテストし、最後の数値で停止します。

def doubles(x):
    for i,a in enumerate(x[:-1]):
        if x[i+1] == a*2:
            print a*2
于 2013-03-20T19:31:16.690 に答える
1
def doubles(lst):
    prev = None
    for actual in lst:
        if prev is not None and actual == 2*prev:
            print actual
        prev = actual
于 2013-03-20T19:32:09.517 に答える
1

これは非常に簡単に行うことができます:

def doubles(seq):
    after = seq[1:]
    for previous, current in zip(seq, after):
        if current == previous * 2:
            print(current)

期待どおりに動作します:

>>> print(list(doubles([3, 0, 1, 2, 3, 6, 2, 4, 5, 6, 5])))
2
6 
4

リストのスライスを取得して、2 番目のリストから値のリストを取得します。次にzip()、前の値を使用して各値をループし、単純にチェックを実行して、一致する場合は値を出力します。

で置き換えることにより、これをジェネレーターとして構築することもできますprint()(yield一般的にはより良いオプションです)。または、本当にリストが必要な場合は、次のようにします。

def doubles(seq):
    after = seq[1:]
    return [current for previous, current in zip(seq, after) 
            if current == previous * 2]
于 2013-03-20T19:33:04.643 に答える
0

ネストされたループは必要ありません。各要素について、その前の要素に対してのみテストする必要があります。

于 2013-03-20T19:30:44.837 に答える