2014-12-14 3 views
1

Как бы я сделал лучшую функцию, чем то, что у меня есть?Суммирование целых чисел в списке python, но за исключением номера 13 и числа непосредственно после него

def sum13(nums): 
    total = 0 
    wheresNumAfter13 = nums.index(13) + 1 
    numAfter13Value = nums[wheresNumAfter13] 
    for num in nums: 
     if num != 13: 
      total += num 
    return total - numAfter13Value 

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

Вы спрашиваете, что именно? – GLHF

ответ

3

Вы можете сделать сумму соответствующего среза, подобно тому, что вы делаете, обратите внимание на индекс 13, а затем сделать сумму для частей списка перед ним и после следующего элемента до 13.

вы также можете использовать встроенный в sum функции на результирующем списке объединения обеих частей:

def sum13(nums): 
    wheres13 = nums.index(13) 
    return sum(nums[0:wheres13]+nums[wheres13+2:]) 

Примечание это решение, как ваша, работает только в случае, когда у вас есть только 13 для исключения из списка.
Кроме того, они будут терпеть неудачу, если список не содержит 13.


Объяснения, для примера списка, как: [1,2,3,4,5,13,4,10]:

  • Посмотрите на 13: wheres13 = nums.index(13)
  • Получить часть списка перед индексом 13: nums[0:wheres13]. Это создает список, например [1,2,3,4,5], т. Е. От индекса 0 до индекса wheres13 (не включая его).
  • Получите часть списка после 13: nums[wheres13+2:]. Это создает список, например [10], то есть из индекса номера после номера после 13 (который имеет индекс wheres13 плюс 2), до конца списка.
  • Соедините оба списка: nums[0:wheres13]+nums[wheres13+2:]. Это создает список как встроено sum функции [1,2,3,4,5,10]
  • Используйте питона в списке из предыдущего пункта

Для полноты Heres версии изменен, чтобы удалить каждый 13 и следующий номер:

def sum13(nums): 
    n=nums 
    while 13 in n: 
     wheres13 = n.index(13) 
     n = n[0:wheres13]+n[wheres13+2:] 
    return sum(n) 
+0

Спасибо @outlyer. Это именно то, что я был после :) – dsgfdg

+0

Не могли бы вы объяснить третью строку в своем ответе? Он отлично работает, я просто не знаю, как это сделать. – dsgfdg

1
def sum13(nums): 
    if 13 in nums: 
     index13 = nums.index(13) 
     del nums[index13:index13 + 2] 
     return sum13(nums) 
    else: 
     return sum(nums) 

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

Это также исключает число после 13? – dsgfdg

+0

Это исключает каждое число после 13 – outlyer

+0

Да. Думаю, это то, чего ты хочешь? Не могли бы вы объяснить мне, что является фактическим требованием? – hariK

2

У меня возникло бы желание написать это как простой генератор-генератор comprehensio п. Это работает, даже если имеется несколько экземпляров 13s:

>>> x = [1,1,1,13,99,1,1,13,99,1,13,13,13,1] 
>>> sum(cur for cur,prev in zip(x, [None]+x) if 13 not in (cur,prev)) 
6 

чтение: сложит все из чисел, для которых curcur или предыдущего номера не 13.

Может писать его как функциональный генератор является более удобным для чтения, хотя:

def exclude_13s(x): 
    for cur,prev in zip(x, [None]+x): 
     if 13 not in (cur,prev): 
      yield cur 

Так что

>>> sum(exclude_13s(x)) 
6 
0

Вы можете сделать это без необходимости использовать list.index или беспокоиться, если 13 присутствует или нет :

from itertools import takewhile, islice 

def sum13(iterable): 
    it = iter(iterable) 
    return sum(takewhile(lambda L: L != 13, it)) + sum(islice(it, 1, None)) 

Это подведет итог, но не включая 13, а затем возобновить суммирование из Iterable игнорирующего номера сразу же после того, как 13

1

Вы можете попробовать этот способ тоже:

def The13(l): 
    size = len(l) 
    bucket = [y for x in range(size) for y in range(x,x+2) if(l[x]==13)] 
    return sum([l[x] for x in range(size) if x not in bucket]) 

ведро содержит все индексы элементов, имеющие 13 и номер непосредственно после него

Смежные вопросы