2017-01-21 2 views
0

Вы можете помочь мне с этим кодом?Почему этот код python не работает?

s = [1, 1, 3, 3, 2, 2, 2, 2, 1, 1, 2, 2, 2] 

def group(s): 
    lst = [] 
    temp_lst = [] 
    for i in s: 
     if len(temp_lst) == 0: 
      temp_lst.append(i) 
      continue 
     if temp_lst[0] == i: 
      temp_lst.append(i) 
     else: 
      lst.append(temp_lst) 
      del temp_lst[:] 
      temp_lst.append(i) 
    return lst 

возвращает:

[[2, 2, 2], [2, 2, 2], [2, 2, 2], [2, 2, 2]] 

Почему?

Мой желаемый результат:

[[1, 1], [3, 3], [2, 2, 2, 2], [1, 1], [2, 2, 2]] 
+1

Вы заполняете внешний список со ссылками на тот же внутренний список; 'del tmp_lst [:]' опустошает существующий список, вы никогда не создадите новый. Также обратите внимание, что 'itertools.groupby' поможет вам. – jonrsharpe

+0

Использование ['itertools.groupby'] (https://docs.python.org/3/library/itertools.html#itertools.groupby):' [list (g) для _, g в groupby (s)] ' –

ответ

2

Это работает: Заменено del temp_lst[:] по temp_lst = []

s = [1, 1, 3, 3, 2, 2, 2, 2, 1, 1, 2, 2, 2] 

def group(s): 
    lst = [] 
    temp_lst = [] 
    for i in s: 
     if len(temp_lst) == 0: 
      temp_lst.append(i) 
      continue 
     if temp_lst[0] == i: 
      temp_lst.append(i) 
     else: 
      lst.append(temp_lst) 
      temp_lst = [] 
      temp_lst.append(i) 
    lst.append(temp_lst) 
    return lst 

print group(s) 

Выход:

[[1, 1], [3, 3], [2, 2, 2, 2], [1, 1], [2, 2, 2]] 

Что del temp_lst[:] делает то, что он удаляет все записи список. Ключ для понимания здесь является то, что вы работаете по ссылке, и вы должны указать temp_list в новый список, так что вы не работают на старом списке вы просто положить в lst

Ведение temp_list = [] оставляет старый список (который вы только что вставлен в lst) и присваивает переменную (вы можете думать о указателе) в новый пустой список, который не связан с только что вставленным списком.

Как jonrsharpe правильно отмечает выше лучшее решение будет itertools.groupby:

s = [1, 1, 3, 3, 2, 2, 2, 2, 1, 1, 2, 2, 2] 
[list(l[1]) for l in itertools.groupby(s)] 

Выход:

[[1, 1], [3, 3], [2, 2, 2, 2], [1, 1], [2, 2, 2]] 
+1

Спасибо, я понимаю это сейчас! –

+0

@a_z_s приветствую, я добавил решение 'groupby', которое предлагает python из коробки, скорее всего, лучше использовать это решение вместо – hansaplast

+0

@a_z_s oh, и вы забыли добавить последний' temp_lst' в 'lst ', Я исправил это и в коде выше – hansaplast

Смежные вопросы