将索引列表制作为列表列表

2024-05-17 09:33:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一个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)

Tags: 方法in程序列表forlen魔术条目
3条回答

这可以通过以下表达式完成:

>>> 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]

from collections import Counter

result = []
last = 0

for k,v in sorted(Counter(li).items()):
    result.append(list(range(last, last + v)))
    last += v

可以使用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]]

相关问题 更多 >