Доступ к кортежу в перечислении? - PullRequest
0 голосов
/ 03 октября 2018

Я хочу перебрать список и суммировать все элементы.За исключением того, что число равно 5, я хочу пропустить число, следующее за этим 5. Так, например:

x=[1,2,3,4,5,6,7,5,4,3] #should results in 30.

Я просто не уверен, как получить доступ к индексу кортежа, когда я использую перечисление.Что я хочу сделать, так это использовать оператор if, который, если число в предыдущем индексе == 5, продолжить цикл.

Спасибо вам

Ответы [ 7 ]

0 голосов
/ 03 октября 2018

Если вы счастливы использовать стороннюю библиотеку, вы можете использовать NumPy с целочисленной индексацией:

import numpy as np

x = np.array([1,2,3,4,5,6,7,5,4,3])

res = x.sum() - x[np.where(x == 5)[0]+1].sum()  # 30

См. Также Каковы преимущества NumPy перед обычными списками Python?

0 голосов
/ 03 октября 2018

Самый длинный код на данный момент.В любом случае перечислять не нужно, это просто FSM .

x = [1,2,3,4,5,6,7,5,4,3]
skip = False
s = 0 
for v in x:
    if skip:
        skip = False
    else:
        s += v
        skip = v == 5
print(s)
0 голосов
/ 03 октября 2018

Не фанат однонаправленных ошибок, за которые проголосовали.

Итак, вот ответ с циклом for.

x=[1,2,3,4,5,6,7,5,4,3, 5] #should results in 35. 

s = 0
for i, v in enumerate(x):
    if i != 0 and x[i-1] == 5: 
        continue 
    s += v

print(s)
0 голосов
/ 03 октября 2018

Вы можете связать список со смещенной версией самого себя.Это должно работать:

sum(val for (prev, val)
    in zip(itertools.chain((None,), x), x)
    if prev != 5 )
0 голосов
/ 03 октября 2018

Документация itertools имеет рецепт для этого, называемый pairwise.Вы можете скопировать и вставить функцию или импортировать ее из more_itertools (который необходимо установить).

Демо:

>>> from more_itertools import pairwise
>>> 
>>> x = [1,2,3,4,5,6,7,5,4,3]
>>> x[0] + sum(m for n, m in pairwise(x) if n != 5)
30

edit:

Но что, если моя структура данных является итеративной, но не поддерживает индексирование?

В этом случае вышеуказанное решение нуждается в незначительной модификации.

>>> from itertools import tee
>>> from more_itertools import pairwise
>>> 
>>> x = (n for n in [1,2,3,4,5,6,7,5,4,3]) # generator, no indices!
>>> it1, it2 = tee(x)
>>> next(it1, 0) + sum(m for n, m in pairwise(it2) if n != 5)
30
0 голосов
/ 03 октября 2018

Простой, многословный способ:

SKIP_PREV = 5
x = [1,2,3,4,5,6,7,5,4,3]
prev = -1
s = 0
for num in x:
    if prev != SKIP_PREV:
        s += num
    prev = num
print(s)
# 30

Компактный, возможно, менее понятный способ:

SKIP_PREV = 5
x = [1,2,3,4,5,6,7,5,4,3]
s = sum(num for i, num in enumerate(x) if i == 0 or x[i - 1] != SKIP_PREV)
print(s)
# 30
0 голосов
/ 03 октября 2018

Использование sum с enumerate

Пример:

x=[1,2,3,4,5,6,7,5,4,3]
print(sum(v for i, v in enumerate(x) if (i == 0) or (x[i-1] != 5)))

Выход:

30
...