2017-01-21 1 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) :'[groupby의 _, g에 대해 list (g)]' –

답변

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) 

출력 : 무엇을 del temp_lst[:]

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

는의 모든 항목을 삭제한다는 것입니다 명부. 여기 이해하는 열쇠는 참조로 작동하는지 그리고 당신은 방금 lst

temp_list = []을하는 넣어 기존 목록에서 작동하지 않도록 새 목록에 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' 솔루션을 추가했습니다. – hansaplast

+0

@a_z_s 오, 대신이 솔루션을 사용하는 것이 가장 좋을 것입니다. 그리고 마지막'temp_lst'를'lst ', 위의 코드에서도이 문제를 해결했습니다. – hansaplast

관련 문제