2016-03-21 22 views
0

Şu anda listedeki birkaç parçayı birleştirmeye çalışıyorum. Ben bugüne kadarPython listesinde birkaç tupleyi birleştirin

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 

alıyorum liste ne var böyle görünüyor:

(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') 

Ne yapmaya çalışıyorum ben sayacı eklemiş bu 3x dizilerini Birleştirme etmektir son. Ama normal birleştirme yolunda değil. İlk girdiden ancak tümünü kaldırmak istiyorum, ancak aynı zamanda sayacı da ona taşıyorum.

Yani

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

Zaten bu bir reoccuring olay ise sonunda sayacı eklemek için liste var

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

hale gelmesi. Ama bunu bir tuple listesi girişine birleştirmek için mücadele ediyorum. Bu, ical bir dışa aktarım içindir, her gün için bir giriş yapmak yerine, tek bir giriş oluşturmalı, ancak + x gün uzunluğunda olmalıdır.

cevap

0

Böylece temelde hiçbir durumda ilk geçtiği ile bilge olayı gruplama ve. zamanların olayı sözdizimi oluştu [(first_date_of_occurrence, Olay, Oluşan Olay Sayısı), ..]. İhtiyaçlarınız için benim tahminim ise doğru aşağıdaki kodu çalışması gerekir:

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)) 

çıkışı: Bu yardımcı olur

[(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)] 

umut :)

+0

sayesinde ben sonra tam olarak ne. Ayrıca siparişi korur. Şimdi her olayda bir toplam var, ama bu tamam. Olay 2'nin el değmemiş olduğunu görebiliyorum. Bu yüzden yalnızca Zaman İçinde Olmayan Olaylar ve Adın eşleştiği yerler için çalışıyor, değil mi? – derchris

+0

Tamam, sonuçta oluşan ical ile test ettim. Yukarıdaki verilerde olduğu gibi, Olay 2'de 2x girişi olmalıdır. Ancak isimde gruplama 1 ile sonuçlanır. Sadece zaman ayarlı değilse gruplandırılmalıdır, örn. veriler [2] – derchris

+0

, verilen örnekle ilgili istenen çıktıyı nazikçe belirtin – hemraj

0

Böyle kullanabilirsiniz:

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