Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 24, 2017 21:15:30

Lork
Зарегистрирован: 2017-01-08
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

List.insert внутри цикла for in - интересное поведение.

Решаю вот такую учебную задачу (вписана прямо в код). То, что цикл не обработал последние 8, -5 и 2 - это, как я понимаю, из-за увеличения кол-ва элементов списка относительно начального (поправьте, пжлста, если ошибаюсь). Но откуда там второй квадрат восьмёрки взялся (..,6, -8, 64, 64,…)???
Заранее благодарю.


 """Дан одномерный массив числовых значений, насчитывающий N элементов.
После каждого отрицательного элемента вставить новый элемент, равный
квадрату этого отрицательного элемента."""
d=[-6, 9, 0, 6, -8, -9, 2, 8, 5, -2]
b=d[:]
for i in d[:]: 
    if d[i]<0:
        d.insert(i+1,d[i]**2)
print('b=',b)
print('d=',d)

Вывод:
 b= [-6, 9, 0, 6, -8, -9, 2, 8, 5, -2]
d= [-6, 36, 9, 0, 6, -8, 64, 64, -9, 2, 8, 5, -2]

Офлайн

#2 Фев. 24, 2017 22:24:56

wallet
Зарегистрирован: 2016-02-21
Сообщения: 50
Репутация: +  2  -
Профиль  

List.insert внутри цикла for in - интересное поведение.

видимо поведение соответствует вашему коду

 d=[-6, 9, 0, 6, -8, -9, 2, 8, 5, -2]
for n, i in enumerate(d): 
    if i < 0:
        d.insert(n+1, i**2)
print(d)
#[-6, 36, 9, 0, 6, -8, 64, -9, 81, 2, 8, 5, -2, 4]

Офлайн

#3 Фев. 24, 2017 22:54:41

Lork
Зарегистрирован: 2017-01-08
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

List.insert внутри цикла for in - интересное поведение.

wallet
видимо поведение соответствует вашему коду
 d=[-6, 9, 0, 6, -8, -9, 2, 8, 5, -2]
for n, i in enumerate(d): 
    if i < 0:
        d.insert(n+1, i**2)
print(d)
#[-6, 36, 9, 0, 6, -8, 64, -9, 81, 2, 8, 5, -2, 4]

Благодарствую. Красиво и элегантно. Но, если принять во внимание, что enumerate() “мы ещё не проходили”, задача может быть решена только с использованием for…in и list.insert или же никак?

Офлайн

#4 Фев. 24, 2017 23:06:37

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

List.insert внутри цикла for in - интересное поведение.

wallet
При нахождении значения числа в нечетной степени, Ваш код не сработает… Нужно пойти другим путем…

Отредактировано Romissevd (Фев. 24, 2017 23:26:14)

Офлайн

#5 Фев. 24, 2017 23:09:13

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

List.insert внутри цикла for in - интересное поведение.

Lork
Но, если принять во внимание, что enumerate() “мы ещё не проходили”, задача может быть решена только с использованием for…in и list.insert или же никак?
Для вашего частного случая можно решить и без enumerate().
 >>> d=[-6, 9, 0, 6, -8, -9, 2, 8, 5, -2]
>>> for e in d:
...     if e < 0:
...         d.insert(d.index(e)+1, e**2)
... 
>>> print(d)
[-6, 36, 9, 0, 6, -8, 64, -9, 81, 2, 8, 5, -2, 4]
>>> 

Офлайн

#6 Фев. 24, 2017 23:36:56

Lork
Зарегистрирован: 2017-01-08
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

List.insert внутри цикла for in - интересное поведение.

old_monty

Интересно, а в чём проявляется частность моего случая?

Так, понял. На нечётных степенях не работает.

Отредактировано Lork (Фев. 24, 2017 23:42:51)

Офлайн

#7 Фев. 25, 2017 06:45:17

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

List.insert внутри цикла for in - интересное поведение.

Lork
Интересно, а в чём проявляется частность моего случая?

Так, понял. На нечётных степенях не работает.
И на четных степенях в общем случае тоже не работает. Оставляю вам проверить это самостоятельно.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version