Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 17, 2015 16:25:52

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

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

Здравствуйте, подскажите пожалуйста как реализовать на 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”
Помогите пожалуйста - как правильно будет написать, чтобы не было ошибки.

Отредактировано dobriy_dada (Окт. 17, 2015 16:41:12)

Офлайн

#2 Окт. 17, 2015 16:56:45

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

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

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

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

for el1, el2 in zip(spisok, spisok[1:]):
    if el1 == 'a' and el2 == 'b':
        do something

Офлайн

#3 Окт. 17, 2015 17:25:34

old_monty
Зарегистрирован: 2015-09-27
Сообщения: 238
Репутация: +  20  -
Профиль   Отправить e-mail  

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

Как вариант, и еще по желанию можно для наглядности добавить вывод сообщений:

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)

Офлайн

#4 Окт. 17, 2015 19:33:00

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

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

giveback
Ваш способ не работает потому что в цикле вы проходите по каждому элементу списка в отдельности
И что?
Ошибка возникает, потому что к последнему индексу прибавляется единица и программа пытается получить доступ к элементу вне пределов списка. Просто нужно проверять, что элемент не последний.



Офлайн

#5 Окт. 17, 2015 19:59:24

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

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

FishHook
И что?
Ошибка возникает, потому что к последнему индексу прибавляется единица и программа пытается получить доступ к элементу вне пределов списка. Просто нужно проверять, что элемент не последний.

Нет, тогда ошибка была бы: list index out of range. А здесь string.
Посмотрите внимательнее код.

Отредактировано giveback (Окт. 17, 2015 19:59:51)

Офлайн

#6 Окт. 17, 2015 20:13:27

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

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

giveback
Нет, тогда ошибка была бы: list index out of range. А здесь string.
Посмотрите внимательнее код.
а теперь подумайте еще раз



Офлайн

#7 Окт. 17, 2015 21:52:59

WoMax
Зарегистрирован: 2014-05-26
Сообщения: 124
Репутация: +  9  -
Профиль   Отправить e-mail  

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

еще вариант:

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)

Офлайн

#8 Окт. 17, 2015 22:18:20

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

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

спасибо большое
А как тогда удалить элемент с индексом i и элемент с индексом i+1 ?
Так как командой del spisok я опять получают ошибку, что значение выходит за выбранный диапазон

Отредактировано dobriy_dada (Окт. 17, 2015 23:40:30)

Офлайн

#9 Окт. 18, 2015 00:32:54

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

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

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 и вызывает ошибку

Отредактировано giveback (Окт. 18, 2015 00:39:56)

Офлайн

#10 Окт. 18, 2015 00:57:46

WoMax
Зарегистрирован: 2014-05-26
Сообщения: 124
Репутация: +  9  -
Профиль   Отправить e-mail  

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

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)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version