合并python列表中的几个元组

时间:2016-03-21 11:53:51

标签: python list merge tuples

我目前正在尝试合并列表中的几个元组。这是我到目前为止所拥有的

==> D:\bat\SO\36125004.bat
pwd=!xxx
pwX=@21@xxx
EDE %21xxx
pwd=!xxx
pwX=%21xxx
pwd !xxx
pwX %21xxx

==>

我得到的清单如下:

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

我想要做的是合并这个3x元组,最后我添加了计数器。 但不是以正常的合并方式。 我想删除除第一个条目以外的所有条目,但也将计数器移动到它。

所以

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

应该成为

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

如果这是一个reoccuring事件,我已经获得了最后添加计数器的列表。但很难将其合并到一个元组列表条目中。 这是用于导出,而不是每天进行一次输入,它应该创建一个条目,但长度为+ x天。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

所以基本上将事件明智地分组为第一次出现事件而不是。 of times事件发生了语法[(first_date_of_occurrence,Event,Event Occurred发生的次数),..]。如果我对您的要求的猜测是正确的,则代码应该有效:

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

希望这有助于:)