[英]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.