Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 18, 2015 02:59:32

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Найти два соседних элемента

dobriy_dada
Дан список, нужно с помощью if сравнить 2 любые соседние элементы, главное чтобы они следовали друг за другом. Что-то типа этого:
Конкретно задачу опиши. Что пытаешься сделать всем этим кодом?



Офлайн

#2 Окт. 18, 2015 08:12:41

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Найти два соседних элемента

Да скорее всего каким-то образом отфильтровать список он хочет, на основе сравнения двух соседних элементов.

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

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 : в документации кстати есть то, что нужно автору.

Отредактировано ayb (Окт. 18, 2015 08:39:44)

Офлайн

#3 Окт. 18, 2015 08:54:03

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Найти два соседних элемента

ayb
Да скорее всего каким-то образом отфильтровать список он хочет, на основе сравнения двух соседних элементов.
Если он в списке сравнивает два соседних элемента, которые являются символами, то это очень похоже на сравнение двух символов строки.
Судя по тому, что он их сравнивает через is, он вообще не разбирается в типах.
Поэтому верятность того, что он вообще работает со строкой, а не со списком, очень высока.



Офлайн

#4 Окт. 18, 2015 09:37:42

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Найти два соседних элемента

giveback
как видно ошибка возникает ещё на первой итерации, т.е. длина списка не причём. также видно что в переменной j находится текущий элемент списка ('a'), поэтому обращение i+1 тут не уместно, так как это обращение не к следующему элементу списка (как требовалось в задании), а к следующей букве строки j. А так как буква здесь одна, то обращение к i+1 и вызывает ошибку
Мда, то что там j вместо spisok я и не заметил. Правда ваша. Но, когда он исправит j на spisok получит уже мою ошибку



Офлайн

#5 Окт. 18, 2015 10:25:16

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Найти два соседних элемента

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 но для объектов питона.



Офлайн

#6 Окт. 18, 2015 11:05:11

dobriy_dada
Зарегистрирован: 2015-09-04
Сообщения: 48
Репутация: +  0  -
Профиль   Отправить e-mail  

Найти два соседних элемента

это задача со скобками (){}
я хочу пройти по списку, состоящему из скобок и если 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  ']'
То эти элементы находятся, но вместе не удаляются :-(

Отредактировано dobriy_dada (Окт. 18, 2015 11:05:52)

Офлайн

#7 Окт. 18, 2015 11:17:19

giveback
Зарегистрирован: 2015-05-03
Сообщения: 36
Репутация: +  6  -
Профиль   Отправить e-mail  

Найти два соседних элемента

Если список состоит только из односимвольных элементов, то:

spisok = list(''.join(spisok).replace('[]','%temp%').replace('{}','%temp%').replace('()','%temp%').replace('%temp%',''))

Отредактировано giveback (Окт. 18, 2015 11:46:13)

Офлайн

#8 Окт. 18, 2015 11:24:21

dobriy_dada
Зарегистрирован: 2015-09-04
Сообщения: 48
Репутация: +  0  -
Профиль   Отправить e-mail  

Найти два соседних элемента

а там же символ в виде ‘(’ и ‘)’, а у Вас они как один символ стоят ‘()’ Вот такой список:

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

Офлайн

#9 Окт. 18, 2015 11:49:08

giveback
Зарегистрирован: 2015-05-03
Сообщения: 36
Репутация: +  6  -
Профиль   Отправить e-mail  

Найти два соседних элемента

В моём коде список вначале объединяется в одну строку, т.е. если список вида:

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

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

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

Офлайн

#10 Окт. 18, 2015 11:57:15

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Найти два соседних элемента

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

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

А просто через .replace() удалять скобки - неправильно, так как после каждого удаления последовательность меняется, из-за чего её надо повторно проходить.
При миллионе символов в строке это сразу будет заметно.



Отредактировано py.user.next (Окт. 18, 2015 11:58:27)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version