如何将/合并主要将相同的订阅者组合到一个,并将非相同部分附加到列表的末尾



您如何将相同的子列表组合到一个sublist中,并在列表末尾附加非相同部分?

例如,这些订订者中的唯一区分因素是每一个sublist结束时的周数和计数。我只想为每个唯一的"用户ID","金额"one_answers"电子邮件"只有一个sublist,并将非相同的部分附加到这个sublist中。

要使事情进一步复杂化,我希望"计数"的顺序按照他们属于哪一周的顺序。例如,下面您可以在第1周看到1个,第2周的第10周,第4周的第1周,第3周没有任何值。在没有价值的情况下,请添加0。

lst = [
        [
          ['UserID','Amount','Email','week1',1],
          ['UserID','Amount','Email','week4',14],
          ['UserID','Amount','Email','week2',10]
        ],
        [
          ['UserID2','Amount','Email','week1',99],
          ['UserID2','Amount','Email','week2',10],
          ['UserID2','Amount','Email','week4',14]
        ]
      ]
Desired_List = [
                 ['UserID','Amount','Email','week1',1,10,0,14],
                 ['UserID2','Amount','Email','week1',99,10,0,14]
               ]

这将结合起来以产生结果,但是在几周内不会将0放置:

[grp[0][:-1]+[item[-1] for item in grp] for grp in lst]

您要实现的目标可能不适合一个衬里。我的方法如下所述,认为可变部分是列表中的最后两个项目,是字典中的键值 - 值。

现在,有了字典,创建了一个周的序列。可以使用str.format轻松完成此操作,并确定任何给定的子列表int(max(seq[0][-1])[4:])的最高一周。

最后,使用 dict.get,查找字典和任何缺失的键,默认为 0

实施

def foo(seq):
    from operator import itemgetter
    # | [['UserID', 'Amount', 'Email', {'week1': 1, 'week2': 10, 'week4': 14}], .|
    # V                                                                          V
    seq_dict = (grp[0][:3] + [dict(map(itemgetter(3,4), grp))] for grp in lst)
    # 'week4' | '4' | 4
    max_weeks = int(max(seq[0][-1])[4:])
    # | ['week1', 'week2', 'week3', 'week4'] |
    # V                                      V
    week_range = range(1, max_weeks + 1)
    return [items[:-1] + [items[-1].get("week{}".format(week), 0) 
                          for week in week_range]
            for items in seq_dict]

输出

>>> pprint.pprint(foo(lst))
[['UserID', 'Amount', 'Email', 1, 10, 0, 14],
 ['UserID2', 'Amount', 'Email', 99, 10, 0, 14]]

最新更新