2

配列内の数値の合計を返します。ただし、6で始まり、次の7まで続く数値のセクションは無視します(6ごとに少なくとも1つの7が続きます)。数値がない場合は0を返します。

sum67([1, 2, 2]) ? 5
sum67([1, 2, 2, 6, 99, 99, 7]) ? 5
sum67([1, 1, 6, 7, 2]) ? 4
def sum67(nums):
    dontadd = 0
    sum = 0
    for i in range(0, len(nums)):
        if dontadd == 0:
            if nums[i] == 6:
                dontadd = 1
            else:
                sum += nums[i]
        else:
            if nums[i] == 7:
                dontadd = 0
            else:
                pass# nothing happens. It is useful as a placeholder when a statement is required syntactically
    return sum

codingbatからこの問題に対するより洗練された解決策を探しています。この答えは、直感的ではないようです。

4

11 に答える 11

8

不要な要素を削除できる場合は、単純な合計を使用できます。次に例を示します。

def sum67(nums):
    nums=nums[:]
    while 6 in nums:
        i=nums.index(6)
        j=nums.index(7,i)
        del nums[i:j+1]
    return sum(nums)

まず、nums=nums[:]コピーを作成するために使用します。発信者はおそらく変更を期待していませんnums

nums.index(6)値が6 nums.index(7,i)の最初の要素のインデックスを検索します。インデックスの後の値が7の最初の要素のインデックスを検索しますi。次に、からdel nums[i:j+1]の範囲の要素を削除します。これには、の要素も含まれます。ijj

于 2012-04-17T03:57:15.697 に答える
3

これはそれほど悪くはありません(ただし、賢くなりすぎていると主張するかもしれません)。

>>> def sum67(nums):
...     while 6 in nums:
...         index = nums.index(6)
...         while nums.pop(index) != 7:
...             pass
...     return sum(nums)
... 
>>> sum67([1, 2, 3])
6
>>> sum67([1, 2, 2, 6, 99, 99, 7])
5
>>> sum67([1, 1, 6, 7, 2])
4
>>> sum67([1, 2, 2, 6, 99, 99, 7, 8, 1, 6, 0, -1000, 7, 2])
16

これは本当に間抜けなものです(負の数では機能しません)

>>> import re
>>> def sum67(nums):
...     return sum(int(j) for j in re.sub(r'6\d*?7', '', ''.join((str(i) for i in nums))))
>>> sum67([1, 2, 3])
6
>>> sum67([1, 2, 2, 6, 99, 99, 7])
5
>>> sum67([1, 2, 2, 6, 99, 99, 7, 8, 1, 6, 0, 7, 2])
16

そのようなコードを書かないでください:p

私がこれを放っておく前にもう1つのひどい1つのライナー:

>>> def sum67(nums):
...     return sum(i if i != 6 else -sum(nums[pos+1:nums.index(7,pos)+1]) for pos, i in enumerate(nums))
... 
>>> sum67([1, 2, 2, 6, 99, 99, 7])
5
>>> sum67([1, 2, 2, 6, 99, 99, 7, 8, 1, 6, 0, -1000, 7, 2])
16
于 2012-04-17T03:46:22.493 に答える
3

私がPythonで最も気に入っているのは、問題を簡単に分解できることです。

def skip67(seq):
    skipping = False
    for value in seq:
        skipping = skipping or value == 6
        yield 0 if skipping else value
        skipping = skipping and value != 7

def sum67(seq):
    return sum(skip67(seq))

>>> sum67([1, 2, 2])
5
>>> sum67([1, 2, 2, 6, 99, 99, 7])
5
>>> sum67([1, 1, 6, 7, 2])
4
于 2012-04-17T04:04:39.197 に答える
2
def sum67(nums):
  i=0
  sum=0
  n=len(nums)
  while i<n:
    if nums[i]==6:
      i=nums.index(7,i)
    else:
      sum += nums[i]
    i+=1
  return sum
于 2012-04-17T03:46:44.063 に答える
2
def sum67(L):
    it = iter(L)
    return sum(all(i!=7 for i in it) if i == 6 else i for i in it)

これがどのように機能するかに興味がある場合は、もう少し読みやすいバージョンです。

def slice67(L):
    it = iter(L)

    for i in it:
        if i != 6:
            yield i
        else:
            while next(it, 7) != 7:
                pass

print sum(slice67([1, 2, 2]))
于 2012-04-17T05:25:10.560 に答える
1

このバージョンはリストを変更しません。

def sum67(xs):
  xs = iter(xs)
  s = 0
  for x in xs:
    if x == 6:
      while x != 7:
          x = xs.next()
    else:
      s += x
  return s
于 2012-04-17T03:46:15.437 に答える
1

私のソリューションはOPとそれほど変わらないでしょうが、一般的には、常に追加操作を行い、「accum」の値を1と0の間で切り替えるロジックを使用するというアイデアが好きです。

def sum67(nbrs):
    total = 0
    accum = 1
    for nbr in nbrs:
        if nbr==6:
            accum=0
        total += nbr*accum
        if accum==0 and nbr==7:
            accum=1
    return total
于 2012-04-17T04:02:10.700 に答える
0

理解しやすいバージョンは次のとおりです。

def sum67(nums):
    found6 = False
    result = 0
    for n in nums:
        if n==6:
            found6 = True
            continue
        if n==7 and found6:
            found6 = False
            continue
        if not found6:
            result += n
    return result
于 2012-04-17T04:02:39.080 に答える
0

これはどう?

>>> def sum67(l):
...     sum = 0
...     add = True
...     for i in l:
...         add = add and (i != 6)
...         sum += add and i or 0
...         add = add or i == 7
...     return sum
... 
>>> print sum67([1, 2, 3]) 
6
>>> print sum67([1, 2, 2, 6, 99, 99, 7]) 
5
>>> print sum67([1, 1, 6, 7, 2]) 
4
>>> print sum67([1, 2, 2, 6, 99, 99, 7, 8, 1, 6, 0, -1000, 7, 2])
16

Pythonがブール式を結果を決定する第1オペランドの値に評価するという事実を利用します。たとえば、のsum += add and i or 0場合、それaddは部分Falseに入り、、の場合、に評価されます。or0addTruei

于 2012-04-17T05:44:51.427 に答える
0
def sum67(nums):
  while 6 in nums:
    for x in nums[nums.index(6):]:
      nums.remove(x)
      if x == 7:
        break
  return sum(nums)
于 2015-10-24T22:09:48.273 に答える
0

リスト内包表記のワンライナー:

def sum67(nums): return sum([x for index, x in enumerate(nums) if (((nums[(index - nums[index::-1].index(6)):].index(7) + (index - nums[index::-1].index(6))) < index) if (6 in nums[:index+1]) else True)])

于 2016-10-28T14:39:29.973 に答える