Найти - Пользователи
Полная версия: Найти два соседних элемента
Начало » Python для новичков » Найти два соседних элемента
1 2 3
dobriy_dada
Здравствуйте, подскажите пожалуйста как реализовать на 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
То python не понимает что за элемент i+1 , пишет, что “string index out of range”
Помогите пожалуйста - как правильно будет написать, чтобы не было ошибки.

giveback
Ваш способ не работает потому что в цикле вы проходите по каждому элементу списка в отдельности. Т.е. в переменной j будет не весь список, а только один конкретный элемент.

Вот такой пример будет работать:

for el1, el2 in zip(spisok, spisok[1:]):
    if el1 == 'a' and el2 == 'b':
        do something
old_monty
Как вариант, и еще по желанию можно для наглядности добавить вывод сообщений:
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
FishHook
giveback
Ваш способ не работает потому что в цикле вы проходите по каждому элементу списка в отдельности
И что?
Ошибка возникает, потому что к последнему индексу прибавляется единица и программа пытается получить доступ к элементу вне пределов списка. Просто нужно проверять, что элемент не последний.
giveback
FishHook
И что?
Ошибка возникает, потому что к последнему индексу прибавляется единица и программа пытается получить доступ к элементу вне пределов списка. Просто нужно проверять, что элемент не последний.

Нет, тогда ошибка была бы: list index out of range. А здесь string.
Посмотрите внимательнее код.
FishHook
giveback
Нет, тогда ошибка была бы: list index out of range. А здесь string.
Посмотрите внимательнее код.
а теперь подумайте еще раз
WoMax
еще вариант:
for i in xrange(len(spisok) - 1):
    if spisok[i] is 'a' and spisok[i+1] is 'b':
        do something
dobriy_dada
спасибо большое
А как тогда удалить элемент с индексом i и элемент с индексом i+1 ?
Так как командой del spisok я опять получают ошибку, что значение выходит за выбранный диапазон
giveback
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
>>> 

как видно ошибка возникает ещё на первой итерации, т.е. длина списка не причём. также видно что в переменной j находится текущий элемент списка ('a'), поэтому обращение i+1 тут не уместно, так как это обращение не к следующему элементу списка (как требовалось в задании), а к следующей букве строки j. А так как буква здесь одна, то обращение к i+1 и вызывает ошибку
WoMax
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]
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