2014-12-13 3 views
5

я получил 2 одномерный список:Замена каждого 2-го элемента в списке

[[5, 80, 2, 57, 5, 97], [2, 78, 2, 56, 6, 62], [5, 34, 3, 54, 6, 5, 2, 58, 5, 61, 5, 16]] 

В котором мне нужно изменить каждый второй элемент 0, начиная с первого. Так оно и должно выглядеть следующим образом:

[[0, 80, 0, 57, 0, 97], [0, 78, 0, 56, 0, 62], [0, 34, 0, 54, 0, 5, 0, 58, 0, 61, 0, 16]] 

алгоритм я использую:

for i in tempL: 
    for j, item in enumerate(i): 
     if i.index(item) % 2 == 0: 
      print('change, index:'), 
      print(i.index(item)) 
      i[j] = 0 
     else: 
      print('not change, index:'), 
      print(i.index(item)) 

Но то, что я получаю это:

change, index: 0 
not change, index: 1 
change, index: 2 
not change, index: 3 
change, index: 4 
not change, index: 5 
change, index: 0 
not change, index: 1 
change, index: 2 
not change, index: 3 
change, index: 4 
not change, index: 5 
change, index: 0 
not change, index: 1 
change, index: 2 
not change, index: 3 
change, index: 4 
not change, index: 5 
change, index: 6 
not change, index: 7 
not change, index: 5 
not change, index: 9 
not change, index: 5 
not change, index: 11 
[[0, 80, 0, 57, 0, 97], [0, 78, 0, 56, 0, 62], [0, 34, 0, 54, 0, 5, 0, 58, 5, 61, 5, 16]] 

Некоторые элементы не изменяются, и это потому, что (I добавленный индекс, чтобы увидеть это), он считает, что индекс этих элементов по какой-то причине равен 7 и 9. Что это может быть, потому что я искал ошибку так долго, пока не могу найти.

Я проверял дважды, в этом списке нет лишних пробелов.

+0

Почему вы используете 'i.index'? Разве вы не имеете в виду 'j'? – kojiro

ответ

2

Я думаю, что ваш алгоритм является правильным. Вы только что сделали логическую ошибку. Используя i.index, вы каждый раз ищете внутренний список для этого значения. Это не только дорого, но и чувствительно к повторяющимся значениям.

for i in tempL: 
    for j, item in enumerate(i): 
     # if i.index(item) % 2 == 0: oops 
     if j % 2 == 0: 
      print('change, index:'), 
      print(i.index(item)) 
      i[j] = 0 
     else: 
      print('not change, index:'), 
      print(i.index(item)) 
+0

Да! Спасибо. – estranged

1

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

>>> l=[[5, 80, 2, 57, 5, 97], [2, 78, 2, 56, 6, 62], [5, 34, 3, 54, 6, 5, 2, 58, 5, 61, 5, 16]] 
>>> l=[[t if k%2 else 0 for k,t in enumerate(i)] for i in l] 
>>> l 
[[0, 80, 0, 57, 0, 97], [0, 78, 0, 56, 0, 62], [0, 34, 0, 54, 0, 5, 0, 58, 0, 61, 0, 16]] 
+0

Итак, я просто меняю 'l' с моим именем? Это ничего не делает для меня, даже если ваш код выглядит хорошо. – estranged

+0

@estranged Я не вижу причины пропустить код, обратите внимание, что мой ответ в оболочке вам нужно распечатать, если вы напишете код в текстовом редакторе !!! – Kasramvd

+0

О да, мне нужно назначить список! Это очень мило. – estranged

3

Ну, эта задача должна быть очевидной. Используйте назначение среза! Вам нужно назначить массив нулей, которые являются половиной длины. Для того, чтобы создать, нужно просто умножить один массив элемент со значением:

for l in tempL: 
    l[::2] = [0] * ((len(l)+1)/2) 

Или используйте repeat из itertools (к сожалению, это в два раза медленнее для небольшого массива):

from itertools import repeat 

for l in tempL: 
    l[::2] = repeat(0,(len(l)+1)/2) 
+0

Я пробовал нарезку, но не понял, как правильно ее использовать. Я также совсем не понимаю вторую половину вашего уравнения. – estranged

+0

Мне было любопытно и сделали некоторые тесты времени, первый метод в этом ответе на порядок (плюс) быстрее, чем понимание - и * масштабирует * лучше с более длинными подсписками. @stranged - назначение * расширенного * среза в левой части требует итерации с правой стороны.Правая сторона создает список нулей с достаточным количеством элементов для назначения. @Arpegius - я не думаю, что вам нужно '' '+ 1''' определить количество нулей. – wwii

+0

@wwii Да, вам нужно '+ 1', как если бы у вас было нечетное количество элементов, вам понадобится еще половина. Если вы начинаете со второго как '[1 :: 2]', то это будет без '+ 1'. – Arpegius

0

Просто добавить свои два цента:

Использование Modulo Оператор

mylist= [[5, 80, 2, 57, 5, 97], [2, 78, 2, 56, 6, 62], [5, 34, 3, 54, 6, 5, 2, 58, 5, 61, 5, 16]] 

for i,n in enumerate(mylist): 
    for j,m in enumerate(n): 
     if j % 2 == 0: 
      mylist[i][j] = 0 

print mylist 

Выход:

[[0, 80, 0, 57, 0, 97], [0, 78, 0, 56, 0, 62], [0, 34, 0, 54, 0, 5, 0, 58, 0, 61, 0, 16]] 
Смежные вопросы