Форум сайта python.su
0
Здравствуйте, подскажите пожалуйста как реализовать на pythone алгоритм?
Дан список, нужно с помощью if сравнить 2 любые соседние элементы, главное чтобы они следовали друг за другом. Что-то типа этого:
if elem[i] is 'a' and elem[i+1] is 'b': do something
for i,j in enumerate(spisok): if j[i] is 'a' and j[i+1] is 'b': do something
Отредактировано dobriy_dada (Окт. 17, 2015 16:41:12)
Офлайн
6
Ваш способ не работает потому что в цикле вы проходите по каждому элементу списка в отдельности. Т.е. в переменной j будет не весь список, а только один конкретный элемент.
Вот такой пример будет работать:
for el1, el2 in zip(spisok, spisok[1:]): if el1 == 'a' and el2 == 'b': do something
Офлайн
20
Как вариант, и еще по желанию можно для наглядности добавить вывод сообщений:
lst = ['x', 'y', 'z', 'a', 'b', 'c', 'd'] prev_elem = lst[0] for elem in lst: if prev_elem == 'a' and elem == 'b' : print("Условие выполняется для двух соседних элементов с индексами {0} и {1}".format(lst.index(prev_elem), lst.index(elem))) print("Do something!") prev_elem = elem
Отредактировано old_monty (Окт. 17, 2015 17:59:28)
Офлайн
568
givebackИ что?
Ваш способ не работает потому что в цикле вы проходите по каждому элементу списка в отдельности
Офлайн
6
FishHook
И что?
Ошибка возникает, потому что к последнему индексу прибавляется единица и программа пытается получить доступ к элементу вне пределов списка. Просто нужно проверять, что элемент не последний.
Отредактировано giveback (Окт. 17, 2015 19:59:51)
Офлайн
568
givebackа теперь подумайте еще раз
Нет, тогда ошибка была бы: list index out of range. А здесь string.
Посмотрите внимательнее код.
Офлайн
9
еще вариант:
for i in xrange(len(spisok) - 1): if spisok[i] is 'a' and spisok[i+1] is 'b': do something
Отредактировано WoMax (Окт. 17, 2015 21:56:06)
Офлайн
0
спасибо большое 
А как тогда удалить элемент с индексом i и элемент с индексом i+1 ?
Так как командой del spisok я опять получают ошибку, что значение выходит за выбранный диапазон
Отредактировано dobriy_dada (Окт. 17, 2015 23:40:30)
Офлайн
6
FishHook
а теперь подумайте еще раз
spisok = ['a','b','c','d'] >>> for i,j in enumerate(spisok): print i, j if j[i] is 'a' and j[i+1] is 'b': print 'do something' 0 a Traceback (most recent call last): File "<pyshell#7>", line 3, in <module> if j[i] is 'a' and j[i+1] is 'b': IndexError: string index out of range >>>
Отредактировано giveback (Окт. 18, 2015 00:39:56)
Офлайн
9
dobriy_dada
А как тогда удалить элемент с индексом i и элемент с индексом i+1 ?
Так как командой del spisok я опять получают ошибку, что значение выходит за выбранный диапазон
maks@maks-1215N:~$ python Python 2.7.9 (default, Dec 15 2014, 01:39:16) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> spisok = [12, 23, 4, 12, 44, 5453] >>> spisok_del = set() >>> for i in xrange(len(spisok) - 1): ... if spisok[i] == 44 and spisok[i + 1] == 5453: ... spisok_del.add(i) ... spisok_del.add(i + 1) ... >>> spisok_del set([4, 5]) >>> spisok = [spisok[i] for i in xrange(len(spisok)) if i not in spisok_del] >>> spisok [12, 23, 4, 12]
Отредактировано WoMax (Окт. 18, 2015 01:04:47)
Офлайн