Nano Hash - криптовалюты, майнинг, программирование

Возможна ли ссылка на записи списка в цикле for без индексов?

Особый интерес представляет вопрос о циклах python for. Инженерным программам часто требуются значения предыдущих или будущих индексов, например:

for i in range(0,n):
    value = 0.3*list[i-1] + 0.5*list[i] + 0.2*list[i+1]

так далее...

Однако мне больше нравится приятный чистый синтаксис Python:

for item in list:
    #Do stuff with item in list

или для списка данных 2d точек:

for [x,y] in list:
    #Process x, y data

Мне нравится концепция цикла по списку без явного использования индекса для ссылки на элементы в списке. Мне было интересно, есть ли чистый способ захватить предыдущий или следующий элемент без зацикливания на индексе (или без независимого отслеживания индекса)?

РЕДАКТИРОВАТЬ:

Спасибо Эндрю Джаффе (а также Марку Байерсу) и gnibbler за простые расширяемые примеры. До сих пор я не знал о модулях itertools или nwise. Джон Мачин - спасибо за очень сложный пример того, что НЕ нужно делать. Вы приложили много усилий к этому примеру, очевидно, что несколько рекурсивный алгоритм, который я представил, не может создать список с тем же количеством элементов, что и входной список, и он создает проблемы, если не использует явные индексы. Подобный алгоритм обычно используется при обработке сигналов.

17.08.2010

Ответы:


1

Вот рецепт, основанный на парном коде itertools, который выполняет общие n- разумная группировка:

import itertools

def nwise(iterable, n=2):
    "s->(s_0,s_1, ..., s_n), (s_1,s_2,..., s_n+1), ... "
    ntup = itertools.tee(iterable, n)
    for i, item in enumerate(ntup):
        for ii in range(i):
            next(item, None)
    return itertools.izip(*ntup)

Который можно использовать таким образом:

>>> import nwise
>>> ll = range(10)
>>> for tup in nwise.nwise(ll,3): print tup
... 
(0, 1, 2)
(1, 2, 3)
(2, 3, 4)
(3, 4, 5)
(4, 5, 6)
(5, 6, 7)
(6, 7, 8)
(7, 8, 9)

[Спасибо ответу Марка Байерса за идею]

17.08.2010

2

Чтобы иметь доступ к элементу и следующему, вы можете использовать парный рецепт это показано в документации itertools:

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)

Это может быть адаптировано для обеспечения доступа к трем соседним элементам вместо двух.

17.08.2010

3
>>> from itertools import islice, izip
>>> seq = range(10)
>>> for x,y,z in izip(*(islice(seq,i,None) for i in range(3))):
...  print x,y,z
... 
0 1 2
1 2 3
2 3 4
3 4 5
4 5 6
5 6 7
6 7 8
7 8 9

это может быть тривиально расширено за пределы 3 элементов.

Если вам нужно, чтобы он работал с любым итерируемым, подходит ответ Эндрю, или вы можете сделать это так

>>> from itertools import izip, islice, tee
>>> seq=(x for x in range(10))
>>> for x,y,z in izip(*(islice(j,i,None) for i,j in enumerate(tee(seq,3)))):
...  print x,y,z
... 
0 1 2
1 2 3
2 3 4
3 4 5
4 5 6
5 6 7
6 7 8
7 8 9
17.08.2010

4

Если хотите использовать zip, вот как НЕ надо делать (набил, без надобности) и как не надо проверять (набил х 2.5), с исправлением тех недостатков.

vector = [2**i for i in range(1,6)]
print "vector", vector
value = []
for i in range(1,len(vector)-1):
    value.append(0.3*vector[i-1] + 0.5*vector[i] + 0.2*vector[i+1])

print "value", len(value), value
value2=[0.3*before + 0.5* this + 0.2 * after
          for before,this,after in zip(vector,vector[1:]+[0], vector[2:]+[0,0])
          ]
# above +[0] and +[0,0] needlessly extend the answer by two items
print "value2", len(value2), value2          
print "bad check bad values", not any([x-y for x,y in zip(value,value2) if x-y > 1e-7])
# the bad check doesn't check for length 
# the bad check doesn't use abs(actual - expected)
# the bad check has a unnecessary if test in it
# the bad check uses a list comprehension when a generator would do
print "good check bad values", (
    len(value2) == len(value)
    and
    not any(abs(x-y) > 1e-7 for x,y in zip(value,value2))
    )
value2=[0.3*before + 0.5* this + 0.2 * after
          for before,this,after in zip(vector,vector[1:], vector[2:])
          ]    
print "fixed value2", len(value2), value2  
print "good check good values", (
    len(value2) == len(value)
    and
    not any(abs(x-y) > 1e-7 for x,y in zip(value,value2))
    )
17.08.2010
  • Это решение было бы правильным, если предполагается, что вектор меняет длину, а расчет используется только для тех значений, у которых есть оба соседа. Множители в примере, похоже, суммируют 1,0, а 0 на самом деле не является соседним значением для первого и последнего чисел векторов. Кроме того, перенос примера на последний в качестве соседа в случае первого значения сомнительный, как бы то ни было 17.08.2010
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..