2016-03-21 4 views
0

В настоящее время я пытаюсь объединить несколько кортежей в списке. Вот то, что я до сих порОбъединить несколько кортежей в списке python

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

То, что я пытаюсь сделать, это объединить эти 3x кортежи, где я добавил счетчик на конец. Но не в обычном способе слияния. Я хочу удалить все, кроме первой записи, но и перенести счетчик на него.

Так

(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 событие. Но изо всех сил пытаемся объединить это в одну запись списка. Это для ical экспорта, где вместо того, чтобы делать одну запись за каждый день, она должна создать единую запись, но с длиной + x дней.

ответ

0

Так в основном группирование события мудрого первым появлением события и нет. из событий события произошел синтаксис [(first_date_of_occurrence, Event, количество раз Событие произошло), ..]. Если мое предположение для вашего требования правильный код следующий должно работать:

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

Хорошо, просто протестирован с результирующим ical. Как и в случае с вышеуказанными данными, событие 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 
Смежные вопросы