Найти - Пользователи
Полная версия: цикл for
Начало » Python для новичков » цикл for
1 2
johniek_comp
Не понимаю в чем ошибка:
for i,c in enumerate(array):
        if c[i] > c[i+1]:


TypeError: ‘int’ object has no attribute ‘__getitem__’
Cryo
По-видимому, в 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





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

enumerate

asilyator
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.
fata1ex
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
asilyator
fata1ex
asilyator, зачем повторять то, что уже было сказано выше?
Написал быстрее, чем прочитал тред, что дальше?

fata1ex
А глядя на это, сразу хочется посоветовать почитать базовую литературу по программированию. Так не пишут.
Эт почему?
py.user.next
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
>>>
FishHook
ИМХО самое православное решение будет таким

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

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

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