2015-10-16 3 views
1

Я пытаюсь перевести 'methuselahs' в двоичный код. Все точки ('.') Должны стать 0, а все O ('O') должны быть равны 1.Изменение значений списка в списке

В настоящее время у меня есть код, который действительно работает, но он вернет только первый список list_of_lists ..

list_of_lists = [['.O'],['...O'],['OO..OOO']] 

def read_file(list_of_lists): 

    """Reads a file and returns a 2D list containing the pattern. 
    O = Alive 
    . = Dead 
    """ 

    end_list = [] 
    sub_list = [] 

    for A_List in list_of_lists: 
     for A_String in A_List: 
      for item in A_String: 

#Adding 0's and 1's to sub_list when given the right input 
       if item == '.': 

        sub_list.append(0) 

       elif item == 'O': 

        sub_list.append(1) 

#Adding the sub 
      end_list.append(sub_list) 

     return end_list 

Выход:

[[0,1]] 

Но Ожидаемый выход:

[[0,1],[0,0,0,1],[1,1,0,0,1,1,1]] 

кто-нибудь знает, как я может ли код изменить все списки, а не только первый?

ответ

3

Outdent return end_listfor A_List in list_of_lists: уровень отступа.

И принеси sub_list = [] в эту for -loop:

def read_file(list_of_lists): 
    """Reads a file and returns a 2D list containing the pattern. 
    O = Alive 
    . = Dead 
    """ 
    end_list = [] 
    for A_List in list_of_lists: 
     sub_list = [] 
     for A_String in A_List: 
      for item in A_String: 
      #Adding 0's and 1's to sub_list when given the right input 
       if item == '.': 
        sub_list.append(0) 
       elif item == 'O': 
        sub_list.append(1) 
      #Adding the sub 
      end_list.append(sub_list) 
    return end_list 
+0

Большое спасибо! Я уже два часа занимаюсь этим, теперь понимаю, что я сделал не так. Также спасибо за быстрый ответ! –

2

Два вопроса, в вашем коде -

  1. Вы возвращаетесь внутри цикла for, следовательно, вы вернетесь, как только вы закончите первый подсписчик. Отсюда вывод, который вы получаете.

  2. Вы не переопределяете sub_list в цикле for, без этого будет добавлено только одно значение sub_list, и любые внесенные вами изменения будут отражены во всех подсписках.

Но вам не нужно все это, вы можете использовать список понимание, чтобы достичь того же -

def read_file(list_of_lists): 
    return [[1 if ch == 'O' else 0 
      for st in sub_list for ch in st] 
      for sub_list in list_of_lists] 

Демо -

>>> def read_file(list_of_lists): 
...  return [[1 if ch == 'O' else 0 
...    for st in sub_list for ch in st] 
...    for sub_list in list_of_lists] 
... 
>>> read_file([['.O'],['...O'],['OO..OOO']]) 
[[0, 1], [0, 0, 0, 1], [1, 1, 0, 0, 1, 1, 1]] 
+0

Я бы никогда не придумал такого решения, но он отлично работает! Спасибо, что ответили так быстро! –

+0

Рад, что мне было полезно! :-). Также, если вы найдете ответы полезными, я бы хотел, чтобы вы попросили вас принять ответ (нажав на отметку в левой части ответа), какой бы ответ вам ни понравился, это было бы полезно для сообщества. –

0

Ваш код нормально. Но проблема в уровне отступлений return end_list. Когда вы вернетесь в for loop, после первой итерации ваша функция вернется и не произойдет другую итерацию.

Попробуйте это, ваш код изменен:

list_of_lists = [['.O'],['...O'],['OO..OOO']] 

def read_file(list_of_lists): 

    """Reads a file and returns a 2D list containing the pattern. 
    O = Alive 
    . = Dead 
    """ 

    end_list = [] 

    for A_List in list_of_lists: 
     sub_list = [] 
     for A_String in A_List: 
      for item in A_String: 

#Adding 0's and 1's to sub_list when given the right input 
       if item == '.': 

        sub_list.append(0) 

       elif item == 'O': 

        sub_list.append(1) 

#Adding the sub 
      end_list.append(sub_list) 

    return end_list 

Выход:

[[0,1],[0,0,0,1],[1,1,0,0,1,1,1]] 
+0

Спасибо. Я сейчас это окк –