[英]Making a list of indexes into a list of lists
我正在寻找一种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]]
不确定这是否比其他答案更好,但我发现它仍然很有趣:
li = [0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 4]
from collections import Counter
result = []
last = 0
for k,v in sorted(Counter(li).items()):
result.append(list(range(last, last + v)))
last += v
这可以使用以下表达式完成:
>>> li = [0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 4]
>>> [[i for i, n in enumerate(li) if n == x] for x in sorted(set(li))]
[[0, 1, 2, 3, 4], [5, 6, 7], [8, 9], [10], [11, 12, 13]]
我的实施:
li = [0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 4]
lout = []
lparz = []
prev = li[0]
for pos, el in enumerate(li):
if el == prev:
lparz.append(pos)
else:
lout.append(lparz)
lparz = [pos,]
prev = el
lout.append(lparz)
print lout
输出
[[0, 1, 2, 3, 4], [5, 6, 7], [8, 9], [10], [11, 12, 13]]
按要求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.