2015-03-06 1 views
1

Это для цикла python и for! Я знаю, что вы можете использовать другие итерации, я хотел бы знать, есть ли решение этой проблемы, используя цикл FOR. Прошу прощения, если это дубликат, я не знал, как сформулировать проблему, чтобы найти ее. Это простой вопрос. Мне нравится циклы и часто их использовать, но когда приходит время изменять элементы по мере их повторения, мне всегда кажется, что нужно создать новый массив с отредактированными элементами. Вот пример:Изменение элементов в массиве python с использованием цикла for

for item in list: 
    if item > 7: 
      item += 1 

товар в этом случае не возвращается в список. Я считаю, что у меня есть что-то вроде этого:

newlist = [] 
    for item in list: 
     if item > 7: 
      item += 1 
     newlist.append(item) 

Это не огромная проблема, но каждый раз, когда я выписывать код, похожий на это мне интересно, если есть не более простой способ, и один, который не создайте новые переменные.

В приведенном выше примере используются встроенные в именах переменных, это только пример, а не то, как кто-то должен реализовать цикл или объявить переменные

+4

не используйте ключевые слова в качестве имен переменных. –

+2

И не используйте имена встроенных типов, таких как 'list',' str', 'int ',' dict' и т. Д. Как имена переменных. [Этот недавний вопрос] (http://stackoverflow.com/q/28793202/4014959) является примером того, что может произойти, если вы не следуете этому правилу. –

ответ

1

Вы можете использовать выражение генератор или список понимание изменить первоначальный список:

lst = [1,3,5,7,8,9,10] 

lst[:] = (i + 1 if i > 7 else i for i in lst) 

print(lst) 
[1, 3, 5, 7, 9, 10, 11] 

Использование списка Комп:

lst[:] = [i + 1 if i > 7 else i for i in lst] 

Синтаксис [:] изменяет первоначальный список.

Это также является более эффективным:

In [18]: %%timeit 
my_list = list(range(10000)) 
for i, item in enumerate(my_list): 
    if item > 7: 
    my_list[i] += 1 
    ....: 
100 loops, best of 3: 2.04 ms per loop 

In [19]: %%timeit 
lst = list(range(10000)) 
lst[:] = (i + 1 if i > 7 else i for i in lst) 
    ....: 

1000 loops, best of 3: 1.55 ms per loop 

In [20]: %%timeit 
lst = list(range(10000)) 
lst[:] = [i + 1 if i > 7 else i for i in lst] 
    ....: 
1000 loops, best of 3: 1.28 ms per loop 
+0

Это работает спасибо. У меня есть следующий вопрос, когда вы говорите более эффективно, вы имеете в виду использование ресурсов для полного выполнения задачи? –

+0

@DaleLudwig, оптимизация списков оптимизирована, создается специальный байт-код 'LIST_APPEND', поэтому мы избегаем накладных расходов при вызове метода list.append. –

+0

Здесь есть интересные идеи, повышающие производительность https://wiki.python.org/moin/PythonSpeed/PerformanceTips –

5

Одна из вещей, которые вы можете сделать

for i, item in enumerate(my_list): 
    if item > 7: 
    my_list[i] += 2