数组中的数字总和,不计算13和数字之后的数字(CodingBat拼图)

时间:2013-02-15 18:41:18

标签: python list

问题:

返回数组中数字的总和,为空数组返回0。除了数字13是非常不吉利的,所以它不计算在13之后立即出现的数字也不计算。

我的代码:

def sum13(nums):
  l = len(nums)
  tot = 0

  if l==0:
    return 0

  for x in range(l):
    if nums[x]!=13:
      if nums[x-1]!=13:
        tot+=nums[x]

  return tot

失败的地方:

sum13([1, 2, 2, 1, 13]) should → 6, but my code is outputting 5
sum13([1, 2, 13, 2, 1, 13]) should → 4, but my code is outputting 3

26 个答案:

答案 0 :(得分:2)

您的问题是x为零时的问题。 x - 1将为-1,因此它会获取列表的最后一个元素(13)。要解决此问题,请不要在x - 1为零时测试x

if x == 0 or nums[x-1] != 13:

在Python中,当您将负索引传递给列表时,它会向后访问其元素,因此:

>>> x = [1,2,3,4,5]
>>> x[-1]
5
>>> x[-2]
4

答案 1 :(得分:1)

以下是解决方案:

def sum13(nums):

    if len(nums) == 0:
        return 0

    for i in range(0, len(nums)):
        if nums[i] == 13:
            nums[i] = 0
            if i+1 < len(nums): 
                nums[i+1] = 0
    return sum(nums)

答案 2 :(得分:1)

另一种查看方式:

def sum13(nums):
  sub = 0
  for i in range(len(nums)):
    if nums[i] == 13 :
      sub+=nums[i]
      if i+1<len(nums) and nums[i+1]!=13:
        sub+=nums[i+1]

  return sum(nums)-sub

答案 3 :(得分:1)

列表总数,但不计算item=13也不计算item+1

def sum13(nums):
  if len(nums)==0:
    return 0
  if nums[-1]==13:
    nums[-1]=0
  for i in range(len(nums)-1):
    if nums[i]==13:
      nums[i]=0
      nums[i+1]=0
  return sum(nums)

答案 4 :(得分:1)

def sum13(nums):
  result = 0
  i = 0

  while i < len(nums):
    if nums[i] == 13:
      i += 2
      continue
    else:
      result += nums[i]
      i += 1

  return result

答案 5 :(得分:1)

def sum13(nums):
    sum = 0
    len_n = len(nums)
    k = 0
    while k < len_n:
        if nums[k] == 13:
        k += 2
    else:
        sum += nums[k]
        k += 1
    return sum

答案 6 :(得分:1)

制作列表的副本,以便原件不会更改,删除数字13的实例和紧随其后的数字,然后对结果列表求和:

def sum13(nums):
    nums = nums[:]
    while 13 in nums:
        i = nums.index(13)
        del nums[i:i+2]
    return sum(nums)

这与此问题的最佳答案类似: looking for a more elegant solution to this

答案 7 :(得分:1)

def sum13(nums):
  if len(nums)==0:
    return 0
  sum=0
  for i in range(1,len(nums)):
    if nums[i]==13 or nums[i-1]==13:
      sum = sum
    else:
      sum += nums[i]
  if nums[0]==13:
    return sum
  else:
    return sum + nums[0]

启动循环形式1并在末尾添加第一个数字(如果它不是13)。

答案 8 :(得分:1)

enumerate()可以给出索引,然后可以使用sum()中的生成器表达式来完成。添加到列表末尾的额外0使其适用于nums[i-1] i = 0时的def sum13(nums): nums += [0] return sum(n for i, n in enumerate(nums) if n != 13 and nums[i-1] != 13)

{{1}}

答案 9 :(得分:1)

def sum13(nums):
    count = 0
    sum = 0
    for i in range(len(nums)):
         if nums[i] == 13 or sum == 1 :
            nums[i]= 0
            sum = sum + 1
         count = count + nums[i]
         if sum  ==  2:
            sum  = 0
    if nums == []:
          return 0
    return coun

答案 10 :(得分:1)

def sum13(nums):
    count = 0
    while count < len(nums):
        if nums[count] == 13:
            del nums[count:count+2]
            continue
        count += 1
    return sum(nums)

答案 11 :(得分:1)

您可以使用next()函数而不是容易出错的索引来避免错误:

def exclude13(iterable):
    it = iter(iterable)
    for x in it:
        if x == 13: # don't yield 13
           next(it) # skip number immediately after 13
        else:
           yield x

print(sum(exclude13([1, 2, 2, 1, 13]))) # -> 6
print(sum(exclude13([1, 2, 13, 2, 1, 13]))) # -> 4

答案 12 :(得分:0)

def sum13(nums):
  sum=0
  count=0
  for i in range(len(nums)):
    if nums[i]!=13:
        count=count-1
        if count<=0:
            sum=sum+nums[i]
    else:
        count=2
  return sum

答案 13 :(得分:0)

这是我采用的一种方法,也很有效

nums = [1, 2, 2, 1, 13,2,1,2,3,13,4,5]
counter = 0
temp = []
for i in range(len(nums)):
    if nums[i] == 13:
        if (i+1) != len(nums) and nums[i+1] != 13:
            temp.append(nums[i+1])
            continue
        elif (i+1) == len(nums):
            continue
    else:
        counter = counter + nums[i]
temp_total = sum(temp)
count_total = counter - temp_total
print(count_total)

答案 14 :(得分:0)

我对问题的思考方式使我可以遍历列表-除了最后一个元素。然后,如果值是13,则下一个元素变为0。从那里-我重新加载列表-并将ALL 13替换为0。最后,我仅对列表的值求和。

def sum13(nums):
for i,x in enumerate(range(len(nums)-1)):
    if (nums[x]==13):
        nums[i+1]=0
        nums=nums
for i,x in enumerate(nums):
    if x==13: #if the element is equal to 13
        nums[i]=0
return sum(nums)

答案 15 :(得分:0)

返回数组中数字的总和,对于空数组返回0。除了13号是非常不幸的数字之外,因此它不会计数,紧接在13号之后的数字也不会计数。

   def sum13(nums):
       nums += [0]
       add=sum(j for i, j in enumerate(nums) if j != 13 and nums[i-1] != 13)
       return add

答案 16 :(得分:0)

def sum13(nums):
    li=[]
    if nums[-1]==13:
        li.append(13)
    for i in range(len(nums)-1):
        if nums[i]==13:    
            li.append(nums[i])
            li.append(nums[i+1])
    n=sum(nums)
    return (n-sum(li))

答案 17 :(得分:0)

这也应该有效。基本上它是一个双重的 continue 语句。您可以使用 enumerate() 为每次迭代分配索引和值对。如果数字是 == 13 --> continue,则下一个迭代项应符合 elif 语句的条件,该语句也适用于 13 前面的项。 Elif 仅对索引 >= 1 的项运行(因此没有问题在 [0] 处超出范围)。

def sum13(nums):
  if nums ==[]:
    return 0
  sum = 0
  for index, val in enumerate(nums):
    if nums[index] == 13:
      continue
    elif nums[index-1] == 13 and index > 0:
      continue
    else:
      sum += val
  return sum

答案 18 :(得分:0)

def sum13(nums):

  summed=0
  flag=True
  index_13=0

  for index, num in enumerate(nums):

    if num==13:
      index_13=index
      flag=False

    if flag==True:
      summed=summed+num

    if index_13+1<= len(nums)-1 and num==nums[index_13+1]:
       flag=True

  return summed

答案 19 :(得分:0)

def sum13(nums):
    sum=0
    ind13=[]
    for num in nums:
        if num==13:
            num=0
            ind13=nums.index(13)
            ind13next=ind13+1
            nums[ind13]=0
            if nums[ind13] !=nums[-1]:
                nums[ind13next]=0
                sum=sum+num
        else:
            sum=sum+num
    return sum

答案 20 :(得分:0)

这是我对此练习的解决方案!!!!

def sum13(nums):
    total = 0
    for i in range(len(nums)):
        if (nums[i] == 13 or nums[i-1] == 13 and i != 0):
            total = total
        else:
            total += nums[i]
    return total

答案 21 :(得分:0)

x=0中的nums[x-1]发生冲突时,因为如果结果为nums[0-1],如果它是13,则它可能不加,所以请最后检查nums[0]

def sum13(nums):
  co=0
  if len(nums)<=0:
    return co
  for a in range(1,len(nums)):
    if nums[a]==13:
      continue
    elif nums[a-1]==13:
      continue
    else:
      co=co+nums[a]      
  if nums[0]!=13:
    co+=nums[0]
  return co


答案 22 :(得分:0)

def sum13(nums):
  nums2 = []
  if 13 in nums:
    for i in range(len(nums)-1): # the -1 is needed to avoid out of range.
      if nums[i] != 13: nums2.append(nums[i])
      else:
        nums[i] = 0
        nums[i+1] = 0
    return sum(nums2)
  return sum(nums)

我创建了一个单独的列表,并将我想要的数字添加到该列表中。 我通过遍历每个元素并通过for循环执行此操作,如果它不等于13那么。

当它最终等于数字13时,我会通过将其设置为零来改变该数字(nums [i] = 0)。然后我还需要通过索引(nums [i + 1] = 0)在零处设置下一个数字。所以他们从列表的总和中打折。

这不是一个完美的解决方案,但它是一个有效的解决方案。

答案 23 :(得分:0)

我以下列方式解决了这个问题。这是蛮力,但确实有效:

def sum13(nums):
    count = 0
    if len(nums) == 0: 
        return 0
    for ans in range(len(nums)):
        if nums[ans] == 13 and ans < len(nums)-1: 
            nums[ans] = 0
            nums[ans+1] = 0
        elif nums[ans] == 13 and ans == len(nums)-1:
            nums[ans] = 0 
        else: 
            count += nums[ans]

    return count

答案 24 :(得分:0)

我建议使用递归解决方案。请注意,虽然列表的索引可能超出范围,但切片会给出一个空列表而不是错误,例如如果a = [1,1,2]那么a [3]会给出错误,而[3:]给出空列表[]。

def sum13(nums):
  if len(nums) == 0:
    return 0
  sum = sum13(nums[1:])
  if nums[0] != 13:
    return sum + nums[0]
  if nums[0] == 13:
    return sum13(nums[2:])

答案 25 :(得分:0)

当你排除之后 之后的数字时,你排除之前 13之前的数字。