如何将大多数相同的子列表组合/合并为一个,并将不相同的部分附加到列表的末尾?

时间:2014-02-03 02:45:05

标签: python list sublist

如何将相同的子列表合并/合并到一个子列表中,并将不相同的部分附加到列表的末尾?

例如,这些子列表中唯一的区别因素是周数和每个子列表末尾的计数。我想为每个唯一的'UserId','Amount'和'Email'只有一个子列表,并将不相同的部分附加到这个子列表中。

为了使事情进一步复杂化,我希望“计数”的顺序在它们属于哪个星期的顺序中。例如,下面你可以看到1表示1周,10表示第2周,14表示第4周,第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]

1 个答案:

答案 0 :(得分:1)

您想要达到的效果可能不适合单线。我的方法如下所述,将列表中最后两项的变量部分视为字典中的键值。

现在,使用字典,创建一个周数序列。这可以使用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]]