簡體   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