2017-01-21 24 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のリスト(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大歓迎ですが、私はpythonが提供する 'groupby'ソリューションを追加しました。代わりに – hansaplast

+0

@a_z_sああ、あなたは最後の' temp_lst'を 'lst '、上のコードでもそれを修正しました – hansaplast

関連する問題