我正在寻找一种 Python 魔术方法来打包那种索引列表
[0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 4]
进入这个,每个索引分组在一个特定的列表中:
[[0, 1, 2, 3, 4], [5, 6, 7], [8, 9], [10], [11, 12, 13]]
我已经用列表推导加上如下所示的附加循环完成了它,但我觉得有一个 Python 单行代码可以做到这一点。我正在处理有时会达到 10000 多个项目的列表,因此性能很重要。
li = [0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 4]
result = [[] for _ in xrange(max(li)+1)]
for i in xrange(len(li)):
result[li[i]].append(i)
最佳答案
您可以使用 itertools.groupby
对值进行分组。然后根据每组的长度计算索引,并保留该组起始索引的运行计数。
from itertools import groupby
def index_list(l):
temp = 0
index_list = []
for key, group in groupby(l):
items = len(list(group))
index_list.append([i+temp for i in range(items)])
temp += items
return index_list
例子
>>> l = [0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 4]
>>> index_list(l)
[[0, 1, 2, 3, 4], [5, 6, 7], [8, 9], [10], [11, 12, 13]]
关于python - 将索引列表变成列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31001446/