繁体   English   中英

合并python列表中的几个元组

[英]Merge several tuples in python list

我目前正在尝试在列表中合并一些元组。 这是我到目前为止的

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

我想做的是合并这3个元组,最后在其中添加了计数器。 但不是以正常的合并方式。 我要删除除第一个条目以外的所有条目,还要将计数器移至该条目。

所以

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

应该成为

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

如果这是重复发生的事件,我已经有列表可以在末尾添加计数器。 但是很难将其合并到一个元组列表条目中。 这是针对ical导出的,它应该创建一个条目,而不是每天输入一个条目,但是长度为+ x天。

您可以这样使用:

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

因此,基本上将事件明智地与事件的首次出现进行分组,而不是。 事件发生的时间语法[(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)]

希望这可以帮助 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM