2016-03-21 10 views
0

現在、リスト内にいくつかのタプルをマージしようとしています。いくつかのタプルをPythonリストにマージする

(u'13', u'Event 1') 
(u'06', u'Event 2') 
(u'07', u'Event 2') 
(u'24', u'Event 3') 
(u'25', u'Event 4') 
(u'8', u'Event 5', 1) 
(u'9', u'Event 5', 2) 
(u'10', u'Event 5', 3) 
(u'27', u'Event 6') 

私がやろうとしている私は何でカウンターを追加したこの3倍のタプルをマージすることです。ここで私はこのようなルックスを取得するリストは、私がこれまで持っているもの

dates = [(u'13', u'01', u'19:00', u'Event 1', u'1', u'', u''), 
     (u'06', u'02', u'10:00', u'Event 2', u'0', u'', u''), 
     (u'07', u'02', u'09:00', u'Event 2', u'0', u'', u''), 
     (u'24', u'02', u'20:00', u'Event 3', u'1', u'', u''), 
     (u'25', u'02', u'19:30', u'Event 4', u'1', u'', u''), 
     (u'8', u'04', u'', u'Event 5', u'1', u'', u''), 
     (u'9', u'04', u'', u'Event 5', u'1', u'', u''), 
     (u'10', u'04', u'', u'Event 5', u'1', u'', u''), 
     (u'27', u'04', u'20:00', u'Event 6', u'1', u'', u'')] 

prev_name = None 
prev_day = None 
counter = 1 
newList = [] 

for value in dates: 
    if prev_name is None and prev_day is None: 
     prev_name = value[3] 
     prev_day = value[0] 
    else: 
     if not value[2]: 
      if prev_name == value[3] and int(value[0]) == (int(prev_day) + 1): 
       prev_name = value[3] 
       prev_day = value[0] 
       counter += 1 
       newList.append((value[0], value[3], counter)) 
       continue 
      else: 
       prev_name = value[3] 
       prev_day = value[0] 
       counter = 1 
       newList.append((value[0], value[3], counter)) 
       continue 
    newList.append((value[0], value[3])) 

for value in newList: 
    print value 

です終わり。 しかし、通常のマージ方法ではありません。 最初のエントリ以外のすべてを削除するだけでなく、カウンタをそのエントリに移動します。

ので

(u'8', u'Event 5', 1) 
(u'9', u'Event 5', 2) 
(u'10', u'Event 5', 3) 

(u'8', u'Event 5', 3) 

になった場合は、私はすでに、これはreoccuringイベントであれば最後にカウンタを追加するために、リストを得ました。しかし、これを1つのタプルリストエントリにマージするのは困難です。 これはicalエクスポートのためのもので、毎日1つのエントリを実行するのではなく、1つのエントリを作成する必要がありますが、長さは+ x日です。

答えて

0

そこで、基本的イベントの最初の発生に賢明なイベントをグループ化していません。イベント[(first_date_of_occurrence、イベント、イベントが発生した回数)、..]が発生しました。あなたの条件のための私の推測がある場合は、正しい次のコードは動作するはずです:

from itertools import groupby 

dates = [(u'13', u'01', u'19:00', u'Event 1', u'1', u'', u''), 
     (u'06', u'02', u'10:00', u'Event 2', u'0', u'', u''), 
     (u'07', u'02', u'09:00', u'Event 2', u'0', u'', u''), 
     (u'24', u'02', u'20:00', u'Event 3', u'1', u'', u''), 
     (u'25', u'02', u'19:30', u'Event 4', u'1', u'', u''), 
     (u'8', u'04', u'', u'Event 5', u'1', u'', u''), 
     (u'9', u'04', u'', u'Event 5', u'1', u'', u''), 
     (u'10', u'04', u'', u'Event 5', u'1', u'', u''), 
     (u'27', u'04', u'20:00', u'Event 6', u'1', u'', u'')] 

def accumulate(l): 
    for key, group in groupby(l, key=lambda x:'%s:%s' % (x[3],x[2])): 
     event_occurence = 0 
     date_occurence = None 
     for i, data in enumerate(group): 
      if i == 0: 
       date_occurence = data[0] 
      event_occurence+=1 
     yield (date_occurence, key.split(':')[0], event_occurence) 

print list(accumulate(dates)) 

出力:このことができます

[(u'13', u'Event 1', 1), (u'06', u'Event 2', 1), (u'07', u'Event 2', 1), (u'24', u'Event 3', 1), (u'25', u'Event 4', 1), (u'8', u'Event 5', 3), (u'27', u'Event 6', 1)] 

希望:)

+0

おかげで、私が後だったまさに。また、注文を保存します。私は今すべてのイベントに合計を持っていますが、それは大丈夫です。私はイベント2が手つかずであることがわかります。だから、時間のないイベントや名前が一致する場所でのみ動作します。 – derchris

+0

さて、得られたicでテストしました。上記のデータと同様に、イベント2は2xのエントリを持つ必要があります。しかし、名前をグループ化すると1になります。時間が設定されていない場合にのみグループ化する必要があります。データ[2] – derchris

+0

は与えられた例に関して好都合に望ましい出力を提供します – hemraj

0

あなたはこのように使用することができます:

dates = [(u'13', u'01', u'19:00', u'Event 1', u'1', u'', u''), 
     (u'06', u'02', u'10:00', u'Event 2', u'0', u'', u''), 
     (u'07', u'02', u'09:00', u'Event 2', u'0', u'', u''), 
     (u'24', u'02', u'20:00', u'Event 3', u'1', u'', u''), 
     (u'25', u'02', u'19:30', u'Event 4', u'1', u'', u''), 
     (u'8', u'04', u'', u'Event 5', u'1', u'', u''), 
     (u'9', u'04', u'', u'Event 5', u'1', u'', u''), 
     (u'10', u'04', u'', u'Event 5', u'1', u'', u''), 
     (u'27', u'04', u'20:00', u'Event 6', u'1', u'', u'')] 

clear_data = [[l[0], l[3]] if l[2] else [l[0], l[3], None] for l in dates] 

new_data = {} 

for event in dates: 
    if event[3] not in new_data: 
     new_data[event[3]] = [event[0]] 
     if not event[2]: 
      new_data[event[3]].append(1) 
    else: 
     if not event[2] and len(new_data[event[3]]) > 1: 
      new_data[event[3]][1] += 1 
     else: 
      new_data[event[3]].append(event[0]) 

result = [] 

for event, data in new_data.items(): 
    if any(isinstance(x, int) for x in data) and len(data) > 1: 
     result.append((data[0], event, data[1])) 
    else: 
     for value in data: 
      result.append((value, event)) 

print result 
関連する問題