11

私はプログラミングが初めてで、codingbat.comの問題を開始しようとしています。私はこの問題に遭遇しました:

配列が与えられた場合、配列に 13 がある場合を除き、合計を計算します。配列に 13 がある場合は、13 とその直後の数字をスキップします。たとえば、[1,2,13,5,1] は 4 になります (13 と 5 がスキップされるため)。

これは私がこれまでに持っているものです。13が複数あるとどうすればいいのかわからないのが悩み…そしてコーディングを効率よく学びたい。手伝ってくれませんか?(私はpython 3.2を使用しています)ありがとう!

def pos(nums):
    for i in nums:
        if i == 13:
            return nums.index(13)
    return False

def sum13(lis):
    if pos(lis)!= False:
        return sum(lis[:pos(lis)])+sum(lis[pos(lis)+1:])
    else:
        return sum(lis)
4

7 に答える 7

11

注意すべきトリッキーなことの1つは、次のようなものです。[1、13、13、2、3]

あなたもスキップする必要があり2ます

def getSum(l):
    sum = 0
    skip = False
    for i in l:
         if i == 13:
             skip = True
             continue
         if skip:
             skip = False
             continue
         sum += i
    return sum

説明

リスト内の項目を1つずつ確認します

あなたがするたびに

  • 最初に13であるかどうかを確認し、13である場合は、としてマークを付けskipTrue、次の項目もスキップできるようにします。
  • 次に、そうであるかどうかを確認します。そうである場合skipTrue、13の直後のアイテムであるため、これもスキップする必要があります。また、次のアイテムをスキップしないようににskip戻す必要があります。False
  • 最後に、上記のどちらの場合でもない場合は、次の値を追加します。sum
于 2012-06-16T01:11:35.207 に答える
6

zip関数を使用して、値をペアでループできます。

def special_sum(numbers):
    s = 0
    for (prev, current) in zip([None] + numbers[:-1], numbers):
        if prev != 13 and current != 13:
            s += current
    return s

または、ワンライナーを行うことができます:

def special_sum(numbers):
    return sum(current for (prev, current) in zip([None] + numbers[:-1], numbers)
               if prev != 13 and current != 13)

イテレータを使用することもできます。

from itertools import izip, chain
def special_sum(numbers):
    return sum(current for (prev, current) in izip(chain([None], numbers), numbers)
               if prev != 13 and current != 13)

( izipの最初のリストは2番目のリストよりも長く、zipizipは余分な値を無視します)。

于 2012-06-16T01:12:32.967 に答える
3

whileループを使用してリストをウォークスルーし、i手動でインクリメントします。各反復で、13に遭遇した場合は、i2回インクリメントします。それ以外の場合は、値を現在の合計に追加し、i1回インクリメントします。

def skip13s(l):
    i = 0
    s = 0
    while (i < len(l)):
        if l[i] == 13:
            i += 1
        else:
            s += l[i]
        i += 1
    return s
于 2012-06-16T01:02:33.607 に答える
2

いくつかのFPスタイル:)

def add_but_skip_13_and_next(acc, x):
    prev, sum_ = acc
    if prev != 13 and x != 13:
        sum_ += x
    return x, sum_

filter_and_sum = lambda l: reduce(add_but_skip_13_and_next, l, (0,0))[1]

>>> print filter_and_sum([13,13,1,4])
4
>>> print filter_and_sum([1,2,13,5,13,13,-9,13,13,13,13,13,1,1])
4

このコードは、ランダムアクセス(直接インデックス付け)を提供しない場合でも、任意のイテレータで機能します-たとえば、ソケット:)

一発ギャグ :)

>>> filter_and_sum = lambda l: reduce(
...     lambda acc, x: (x, acc[1] + (x if x != 13 and acc[0] != 13 else 0)),
...     l, (0,0))[1]
>>> print filter_and_sum([1,2,13,5,13,13,-9,13,13,13,13,13,1,1])
4
于 2012-06-16T05:14:25.253 に答える
1

これが最もコンパクトなソリューションだと思います。

def triskaidekaphobicSum(sequence):
    return sum(sequence[i] for i in range(len(sequence))
               if sequence[i] != 13 and (i == 0 or sequence[i-1] != 13))

これは、ジェネレータ式に組み込まれているsum()関数を使用します。ジェネレーターは、13でない限り、または13の直後にある限り、シーケンス内のすべての要素を生成します。追加の「または」条件は、シーケンスの最初の項目(前の項目がない)を処理することです。

于 2012-06-16T02:53:22.973 に答える
0

whileループを使用して複数を処理でき13ます。

def sum13(lis):
    while pos(lis):
        if pos(lis) == len(lis) - 1:
            lis = lis[:pos(lis)]
        else:
            lis = lis[:pos(lis)]+lis[pos(lis)+1:]

    return sum(lis)
于 2012-06-16T01:05:07.447 に答える
0
def skipAndAddFun(inputVal, skipList):
   sum = 0
   for i in inputVal:
        if not i in skipList:
            sum += i
    return sum

使用法:

skipAndAddFun([1,2,13,5,1], [13, 5])
4

この単純な関数は、質問に対する一般的な解決策になります。

于 2017-01-08T12:15:47.423 に答える