Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 1, 2012 18:58:19

johniek_comp
Зарегистрирован: 2012-05-28
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

цикл for

Не понимаю в чем ошибка:

for i,c in enumerate(array):
        if c[i] > c[i+1]:


TypeError: ‘int’ object has no attribute ‘__getitem__’

Отредактировано johniek_comp (Июнь 1, 2012 19:18:54)

Офлайн

#2 Июнь 1, 2012 19:34:12

Cryo
Зарегистрирован: 2012-06-01
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

цикл for

По-видимому, в array содержатся объекты, имеющие тип ‘int’ - числа
__getitem__ - специальный метод, позволяющий получить элемент по индексу или ключу

>>> s = 'python'
>>> s.__getitem__(0)
'p'
>>> s[0]
'p'
>>> n = 1025
>>> n.__getitem__(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute '__getitem__'

Нужно понимать, что твоя переменная с - это на каждой итерации каждый последующий элемент в массиве array, но не сам array:
>>> for i, c in enumerate([10, 20, 30, 40, 50]):
...     i, type(c)
... 
(0, <type 'int'>)
(1, <type 'int'>)
(2, <type 'int'>)
(3, <type 'int'>)
(4, <type 'int'>)

Можно было написать так:

>>> array = [1,5,3,8,9,0,4,3]
>>> for i in range(len(array)):
...     try:
...         array[i] > array[i+1]
...     except IndexError:
...         pass





Отредактировано Cryo (Июнь 1, 2012 20:25:16)

Офлайн

#3 Июнь 1, 2012 21:29:09

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

цикл for

Cryo
Можно было написать так:
Проще без try:
for i in range(len(array) - 1):
    ...

Офлайн

#4 Июнь 1, 2012 22:59:46

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

цикл for

enumerate



Офлайн

#5 Июнь 1, 2012 23:33:02

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

цикл for

johniek_comp
Не понимаю в чем ошибка:
for i,c in enumerate(array):
        if c[i] > c[i+1]:


TypeError: ‘int’ object has no attribute ‘__getitem__’
В c у тебя будет не array, а его элемент. Надо так:

for i,c in enumerate(array):
        if array[i] > array[i+1]:

Или лучше
prev = array[0]
for i in array:
    if prev > i:
        #...
    prev = i
Вообще я не очень люблю обращение по индексу там, где без него можно обойтись, например, с foreach.



Отредактировано asilyator (Июнь 1, 2012 23:34:32)

Офлайн

#6 Июнь 2, 2012 00:04:47

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

цикл for

asilyator, зачем повторять то, что уже было сказано выше?

Cryo
Нужно понимать, что твоя переменная с - это на каждой итерации каждый последующий элемент в массиве array, но не сам array
asilyator
В c у тебя будет не array, а его элемент

Зачем предлагать неработающий код?
>>> array = [1,2,3]
>>> for i,c in enumerate(array):
...         if array[i] > array[i+1]:
...             pass
...             
Traceback (most recent call last):
  File "<input>", line 2, in <module>
IndexError: list index out of range

А глядя на это, сразу хочется посоветовать почитать базовую литературу по программированию. Так не пишут.
prev = array[0]
for i in array:
    if prev > i:
        #...
    prev = i



Офлайн

#7 Июнь 2, 2012 02:40:38

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

цикл for

fata1ex
asilyator, зачем повторять то, что уже было сказано выше?
Написал быстрее, чем прочитал тред, что дальше?

fata1ex
А глядя на это, сразу хочется посоветовать почитать базовую литературу по программированию. Так не пишут.
Эт почему?



Офлайн

#8 Июнь 2, 2012 10:01:29

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

цикл for

asilyator
Эт почему?
элемент сравнивается с самим собой

наверху написан вариант с range()
ещё один добавлю
>>> array = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
>>> for i in range(1, len(array)):
...     print(array[i - 1] > array[i])
... 
False
False
False
False
True
False
False
False
False
>>>



Офлайн

#9 Июнь 2, 2012 11:24:49

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

цикл for

ИМХО самое православное решение будет таким

a = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5,7]
for p, n in  zip(a[:-1], a[1:]):
...     print p>n
False
False
False
False
True
False
False
False
False
False



Офлайн

#10 Июнь 2, 2012 13:58:56

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

цикл for

asilyator, плюс к замечанию py.user.next то, что в вашем варианте нам приходится держать в голове больше деталей, чем при варианте с доступом по индексу. И это в коде, где всего несколько строк. Подобные вещи довольно быстро захламляют программу.

FishHook, решение красивое, но слишком сложное :)



Отредактировано fata1ex (Июнь 2, 2012 13:59:07)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version