2016-12-30 2 views
0

以下の例のようなシーケンスで発生するイベントを分析しています。 データフレームの型とインデックスに関する要素を持つタプルのリストを表示します。 タイプが逐次変更されない限り、すべてのインデックスが同じタイプに属する場合は、すべてのインデックスを保存します。連続したインデックスを順番に保存

l=[('question', 0), 
    ('response', 1), 
    ('response', 2), 
    ('response', 3), 
    ('response', 4), 
    ('response', 5), 
    ('response', 6), 
    ('response', 7), 
    ('response', 8), 
    ('response', 9), 
    ('response', 10), 
    ('response', 11), 
    ('question', 12), 
    ('response', 13), 
    ('response', 14), 
    ('response', 15), 
    ('question', 16), 
    ('response', 17), 
    ('question', 18), 
    ('response', 19), 
    ('question', 20), 
    ('response', 21), 
    ('question', 22) 
    ] 

所望の出力:

[('query', 0), 
('response', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]), 
('query', [12]), 
('response', [13, 14, 15]), 
('query', [16]), 
('response', [17]), 
('query', [18]), 
('response', [19]), 
('query', [20]), 
('response', [21])] 

はここに私のソリューションです。これを行うより良い方法はありますか?ここで

def fxn(listitem): 
    newlist = None 
    collected_items = [] 
    current_comm_type = listitem[0][0] 
    for element in listitem: 
     if len(collected_items) == 0: 
      collected_items.append(listitem[0]) 
     elif element[0] == current_comm_type: 
      newlist[1].extend([element[1]]) 
     else: 
      if not newlist: 
       current_comm_type = element[0] 
       newlist = [current_comm_type] 
       newlist.append([element[1]]) 
      else: 
       collected_items.append(tuple(newlist)) 
       current_comm_type = element[0] 
       newlist = [current_comm_type] 
       newlist.append([element[1]]) 
      # collected_items.append(newlist) 
    return collected_items 

fxn(l) 
+2

は、あなたが正確にあなたのインデントを再現していることを確認しますPythonコードを投稿するとき。それ以外の場合は、読者に読んでほしいコードに新しいエラーを導入しています。 – khelwood

答えて

4

itertools.groupbyリスト内包でそれを行うための一つの方法です。ここで

from itertools import groupby 

r = [(k, [y for _, y in g]) for k, g in groupby(l, lambda x: x[0])] 
print(r) 
# [('question', [0]), ('response', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]), ('question', [12]), ('response', [13, 14, 15]), ('question', [16]), ('response', [17]), ('question', [18]), ('response', [19]), ('question', [20]), ('response', [21]), ('question', [22])] 
1

は、発電機としてのソリューションです:

def my_fxn(input_list): 
    output = None 
    for key, value in input_list: 
     if output is None or key != output[0]: 
      if output is not None: 
       yield output 
      output = (key, [value]) 
     else: 
      output[1].append(value) 
    yield output 
関連する問題