2017-09-26 21 views
-3

奇数のインデックスに配置された要素の合計を返すには、この関数が必要です。 そして、それは私が今持っているものです。リスト内の要素の一部だけを合計する方法

def getSumOdds(aList): 
    for element in aList: 
     if element % 2 == 1: 
+0

ようこそ。残念ながら、これは勉強会、ディスカッションフォーラム、コード作成サービスではありません。 [ask]とその中で参照されているリンクを読む時間を取ってください。 – wwii

+0

コードやデータを投稿してください - https://stackoverflow.com/editing-help#comment-formatting – wwii

+0

広すぎるため閉鎖された人は誰ですか?その投票は間違っている可能性があります。これを行うにはいくつかの方法がありますが、最もPython的な方法は組み込みの 'sum'関数を使い、' enumerate'と一緒にジェネレータを使います。 – jrd1

答えて

1

既に開始しているコードを使用すると、おそらくenumerateがリスト内の数と値を返す関数になります。次に、奇数のインデックスをフィルタリングし、すでに行ったように合計の変数に追加します。

def getSumOdds(aList): 
    total = 0 
    for index, element in enumerate(aList): 
     if index % 2 == 1: 
      total += element 
    return total 

l = [1, 2, 3, 4, 5, 6, 7, 8, 9] 

print getSumOdds(l) # 20 (odd indices: 2+4+6+8=20) 
0

あなたがfor element in aListをやっているので、ちょうどあなたが各要素が奇数の場合element % 2 == 1がチェックする、list[1::2] または機能

def getSumOdds(aList): 
    return sum(aList[1::2]) 
2

リストのスライスを使用することができますそのインデックスが奇数でない場合は除きます。

value = 0 
for index in range(len(aList)): 
    if index % 2 == 1: 
     value += aList[value] 

これはインデックスのすべてを通過し、それは奇妙だ場合、アキュムレータにそのインデックスの要素を追加します。あなたは何ができるか

はこれです

この方法はかなりわかりやすいです。しかし、それは要素の不必要な数を経る:

value = 0 
for index in range(1, len(aList), 2): 
    value += aList[index] 

range(x, y, z)zによって数え、すべての要素までxからカウントアップが、y含みませんが生成されます。これは1から始まり、2つの要素ごとに取ります。

これは、しかしかなり長く、以下に短縮することができる。

value = sum(aList[index] for index in range(1, len(aList), 2)) 

aList[start:end:jump]endまでstartから始まるすべてのjump番目の要素(暗黙的に非常に端)を与えるリストスライシングを使用して、次の操作を実行できます。

value = sum(aList[1::2]) 

これは、最初の要素から始まるすべての2番目の要素を合計します。

あなたの入力は必ずしも(それが反復可能だが、このようなセット、範囲、マップ、などなど[index]構文を使用することはできません、つまり)、あなたが行うことができます割り出し可能でない場合は、次の

value = sum(val for index, val in enumerate(anIter) if index % 2 == 1) 

これは、すべての値を合計し列挙された各値のインデックスと値を取得することによって、インデックスは奇数です。 enumerate関数は、(0, a[0]), (1, a[1]), ..., (len(a) - 1, a[-1])を返す繰り返し可能な関数です。

+0

注:任意のiterable(索引付け不可能な)型(itertools.islice'を使って)(https://docs.python.org/3/library/itertools.html#itertools.islice)を処理し、インデックスの計算を避けることができます。 'sum(itertools.islice(anIter、1、None、2))'であり、インデックスを全くトラッキングする必要はありません(使用されていない値を削除することは、Cレイヤーで効率的に処理されます)。スピードと簡潔さを考慮する価値のある唯一の2つのソリューションは、実際のスライスと「イスリス」アプローチです。前者は高速ですがシーケンスのみですが、後者は遅くなりますがすべてのiterableを処理します。 – ShadowRanger

+0

@ShadowRangerクール、追加情報ありがとう! – HyperNeutrino

関連する問題