2017-09-14 18 views
0

リスト内の整数要素の合計を返す関数を書くことを試みています。しかし、リストに13がある場合は、13を除外し、合計の直後にあるものを除外する必要があります。これまで私は次のコードを考え出しました。これは、背中合わせに2つの13がある場合を除き、ほぼすべての場合に有効です。例えば、私がprint(sum13([13, 13, 2, 13, 1, 5, 6, 13]))で関数を呼び出すと、11の出力を与えるのではなく、13という結果が得られます。どんな助けもありがとうございます。リスト内の要素の合計を計算するためのPythonループ13

def sum13(nums): 

     while 13 in nums: 
      index13 = nums.index(13) 
      nums = nums[0:index13]+nums[index13+2:] 
     return sum(nums) 
+1

あなたのロジックで最初の13は2番目の13を省略する必要があります( "13を除外する必要がありWHATVERはその直後に来ます)。したがって2 + 5 + 6 = 13 – BlooB

+0

13それだけでなく13の後に来るものを省略する必要があります。したがってこの場合、リストから2も省略する必要があります。 – Hoist

+0

私はあなたがしたいことを理解していますが、私が言っているのはあなたのロジックの反映です。私はあなたが間違っていた場所を見るのを助けようとしています:-)最初の13は2番目の13を省略するので、2番目の13は2を省略できません。 – BlooB

答えて

1

このような何かを行うための慣用的な方法は、例えば、前回の変数を追跡するためにある:

def sum13(nums): 
    prev = None 
    my_sum = 0 
    for ele in nums: 
     if ele != 13 and prev != 13: 
      my_sum += ele 
     prev = ele 
    return my_sum 

if __name__ == "__main__": 

    print(sum13([1,2,13,3,4])) 
    print(sum13([13, 13, 2, 13, 1, 5, 6, 13])) 

結果:あなたが判断するために、スライスを使用することができ

7 
11 
0

13が数字の前にあるかどうか:

def sum13(nums): 
    sum_ = 0 
    for index, elem in enumerate(nums): 
     if 13 not in nums[max(index-1, 0):index+1]: 
      sum_ += elem 
    return sum_ 

maxは最初の要素にのみ必要です。i-10-1となるため、スライスは[-1:1]になります。これは空です。

sum(e for i, e in enumerate(nums) if 13 not in nums[max(i-1, 0):i+1]) 
1

あなたは機能的にそれを行うことができます:あなたも、あなたが本当にしたい場合は、1行にそれを減らすことができ

def sum13(nums): 
    return sum(current 
       for current, following 
       in zip(nums, [None] + nums[:-1]) 
       if current != 13 and following != 13) 

「ギミ13ない全ての数の合計、およびその次の番号は13ではありません "。

+0

'next' - 変数名としてpython組み込み関数を使わないでください。 Python対応のカラーエディタで – f5r5e5d

+0

@ f5r5e5d:Fair。何かがPythonの組み込みであるかどうかは決して覚えていません。これは私がPythonをもっと好きにならない理由の一つです。 – Amadan

0

発電機があまりにも愛する必要があるため:

l = [13, 13, 2, 13, 1, 5, 6, 13] 

def sanitize(list): 
    il = iter(list) 
    for e in il: 
     while e == 13: 
      e = next(il) 
      if e != 13: 
       e = next(il) 
     yield e 

print(sum(sanitize(l))) 

アイデアは、あなたが最初にあなたのリストをクリーンアップし、それをまとめるということで。

0

以下を試してください。これはこれはこれは、あなたがして管理するための小さなリストを持っていると仮定している、しかし、唯一の[0, 2, 3, 4, 6]

を合計する権利

def refine(nums, index_i): 
    while 13 in nums: 
     print(nums) 
     index = len(nums) - nums[::-1].index(13) - 1 
     if index == index_i -1: 
      nums = refine(nums[0:index] + nums[index+1:], index) 
     else: 
      nums = refine(nums[0:index] + nums[index+2:], index) 
    return nums 

    print(sum(refine([0, 13, 1, 2, 3, 4, 13, 13, 7, 13, 13, 5, 6, 13], 0))) 

後13S、または13Sのシリーズと番号を削除するnexted機能を使用していることに注意してくださいそのような操作のパフォーマンスを考えるかもしれません

関連する問題