繁体   English   中英

Python:创建列表列表

[英]Python: create a list of list of lists

我正在尝试创建一个列表列表。 我有下面的数据集

ID  date    product
A   01/01/2018  1
A   01/01/2018  2
A   02/01/2018  2
B   01/01/2018  3
B   01/01/2018  4
B   02/01/2018  2
B   04/01/2018  1
B   04/01/2018  2
B   04/01/2018  3

目标是创建这种列表:

[[[1,2], [2]], [[3,4],[2],[1,2,3]]]

最外面的列表对应于客户 ID,中间是购买产品的日期,最里面是产品。

您可以使用itertools.groupby两个应用程序来执行此操作,一个按 ID 分组,另一个按日期分组。

下面的代码使用了三重嵌套列表推导式,它很紧凑,但不是那么容易阅读。 我很快会发布一个更长的版本。

from itertools import groupby
from operator import itemgetter

data = '''\
ID  date    product
A   01/01/2018  1
A   01/01/2018  2
A   02/01/2018  2
B   01/01/2018  3
B   01/01/2018  4
B   02/01/2018  2
B   04/01/2018  1
B   04/01/2018  2
B   04/01/2018  3
'''

data = (row.split() for row in data.splitlines())

#skip header
next(data)

result = [[[u[-1] for u in group]
    for _, group in groupby(row, itemgetter(1))]
        for _, row in groupby(data, itemgetter(0))]

print(result)

输出

[[['1', '2'], ['2']], [['3', '4'], ['2'], ['1', '2', '3']]]

这是一个使用传统for循环的版本(主要是)。 它还将产品编号从字符串转换为整数。

from itertools import groupby
from operator import itemgetter

data = '''\
ID  date    product
A   01/01/2018  1
A   01/01/2018  2
A   02/01/2018  2
B   01/01/2018  3
B   01/01/2018  4
B   02/01/2018  2
B   04/01/2018  1
B   04/01/2018  2
B   04/01/2018  3
'''

data = (row.split() for row in data.splitlines())

#skip header
next(data)

ig1 = itemgetter(1)
result = []
for _, row in groupby(data, itemgetter(0)):
    sublist = []
    for _, group in groupby(row, ig1):
       sublist.append([int(u[-1]) for u in group])
    result.append(sublist)

print(result)

输出

[[[1, 2], [2]], [[3, 4], [2], [1, 2, 3]]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM