Найти - Пользователи
Полная версия: Найти два соседних элемента
Начало » Python для новичков » Найти два соседних элемента
1 2 3
py.user.next
dobriy_dada
Дан список, нужно с помощью if сравнить 2 любые соседние элементы, главное чтобы они следовали друг за другом. Что-то типа этого:
Конкретно задачу опиши. Что пытаешься сделать всем этим кодом?
ayb
Да скорее всего каким-то образом отфильтровать список он хочет, на основе сравнения двух соседних элементов.

Вот буквально вчера тоже столкнулся с такой задачей, только мне от итератора нужен не только следующее значение но и предидущее. Написал вот такой итератор ( я думаю что-то подобное есть в закромах у любого питониста )

from itertools import tee, islice, chain
def prv_cur_nxt(iterable):
    """example:
        for i in prv_cur_nxt(range(3)):
            print(i)
            
        (None, 0, 1)
        (0, 1, 2)
        (1, 2, None)
    """
    prv, cur, nxt = tee(iterable, 3)
    prv = chain([None], prv)
    nxt = chain(islice(nxt, 1, None), [None])
    return zip(prv, cur, nxt)

Ну и например есть список . Из него нужно убрать элементы, которые встречаются 2 раза подряд, т.е. убрать единицы и девятки :

lst = [1, 1, 2, 3, 5, 9, 9, 9, 15]
lst = [c for p, c, n in prv_cur_nxt(lst) 
       if not any([c == p, n == c, p == n])]

EDIT : в документации кстати есть то, что нужно автору.
py.user.next
ayb
Да скорее всего каким-то образом отфильтровать список он хочет, на основе сравнения двух соседних элементов.
Если он в списке сравнивает два соседних элемента, которые являются символами, то это очень похоже на сравнение двух символов строки.
Судя по тому, что он их сравнивает через is, он вообще не разбирается в типах.
Поэтому верятность того, что он вообще работает со строкой, а не со списком, очень высока.
FishHook
giveback
как видно ошибка возникает ещё на первой итерации, т.е. длина списка не причём. также видно что в переменной j находится текущий элемент списка ('a'), поэтому обращение i+1 тут не уместно, так как это обращение не к следующему элементу списка (как требовалось в задании), а к следующей букве строки j. А так как буква здесь одна, то обращение к i+1 и вызывает ошибку
Мда, то что там j вместо spisok я и не заметил. Правда ваша. Но, когда он исправит j на spisok получит уже мою ошибку
doza_and
ayb
Написал вот такой итератор ( я думаю что-то подобное есть в закромах у любого питониста )

Ну у меня такого нет. Обычно хватает
a=[1,2,3,1,"a","b"]
for i in zip(a,a[1:],a[2:]):
    print(i)
>>> 
(1, 2, 3)
(2, 3, 1)
(3, 1, 'a')
(1, 'a', 'b')
Требование дополнения None уж очень специфическое, не думаю что многим нужна именно такая последовательность.
Для преобразования структур данных кое что можно найти в https://toolz.readthedocs.org/en/latest/
Но на мой взгляд все равно не хватает Flatten. Возможно еще полезен инструмент типа xpath но для объектов питона.
dobriy_dada
это задача со скобками (){}
я хочу пройти по списку, состоящему из скобок и если 2 соседних элемента представляют собой открывающуюся и закрывающуюся скобку, то удалить эти элементы из списка. Удалить получается только элемент i, командой
del spisok[i]
или
del spisok[i+1]
Но вместе их удалить не получается
Если код такой
for i in range(len(term) - 1): 
            if term[i] is '[' and term[i+1] is  ']'
То эти элементы находятся, но вместе не удаляются :-(
giveback
Если список состоит только из односимвольных элементов, то:

spisok = list(''.join(spisok).replace('[]','%temp%').replace('{}','%temp%').replace('()','%temp%').replace('%temp%',''))
dobriy_dada
а там же символ в виде ‘(’ и ‘)’, а у Вас они как один символ стоят ‘()’ Вот такой список:
['(', '{', '[', ']', '}', ')', '[', '(', '{', '}', ')', ']']
giveback
В моём коде список вначале объединяется в одну строку, т.е. если список вида:

['(', '{', '[', ']', '}', ')', '[', '(', '{', '}', ')', ']']

то получится строка

'({[]})[({})]'

py.user.next
dobriy_dada
это задача со скобками (){}
Задачи со скобками делаются через стек.

dobriy_dada
if term[i] is '['
is нельзя использовать для таких проверок.

А просто через .replace() удалять скобки - неправильно, так как после каждого удаления последовательность меняется, из-за чего её надо повторно проходить.
При миллионе символов в строке это сразу будет заметно.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB