【问题标题】:Merge several tuples in python list合并python列表中的几个元组
【发布时间】:2016-07-07 22:05:16
【问题描述】:

我目前正在尝试合并列表中的一些元组。这是我目前所拥有的

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)

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

【问题讨论】:

    标签: python list merge tuples


    【解决方案1】:

    你可以这样使用:

    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
    

    【讨论】:

      【解决方案2】:

      因此,基本上将事件与第一次发生的事件和否进行分组。事件发生次数语法 [(first_date_of_occurrence, Event, No. of times 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)]
      

      希望这会有所帮助:)

      【讨论】:

      • 谢谢,正是我所追求的。它还保留了顺序。我现在对每个事件都有一个总数,但这没关系。我可以看到事件 2 没有受到影响。所以它只适用于没有时间的事件,并且名称匹配,对吧?
      • 好的,刚刚使用生成的 ical 进行了测试。与上述数据一样,事件 2 应该有 2 个条目。但是名称上的分组结果为 1。它应该只在没有设置时间的情况下分组,例如数据[2]
      • 请根据给定示例提供所需的输出
      • 取同样的数据,输出应该是:[(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)]
      • 只是喜欢 key=lambda x:'%s:%s' % (x[3],x[2]) 的 group-by 键。代码按要求修改。希望未来的改变可以由你来完成:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-19
      • 2018-07-22
      • 2018-08-24
      相关资源
      最近更新 更多