您如何将相同的子列表组合到一个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]]