如何将相同的子列表合并/合并到一个子列表中,并将不相同的部分附加到列表的末尾?
例如,这些子列表中唯一的区别因素是周数和每个子列表末尾的计数。我想为每个唯一的'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]
答案 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]]