从列表中创建具有相等值的索引的子列表

时间:2018-12-04 15:24:21

标签: python python-3.x list

我正在尝试将整数列表拆分为相等整数索引的子列表。所以说我有一个清单:

original_list = [1,2,1,4,4,4,3,4,4,1,4,3,3]

所需的输出将是:

indexes : [[0,2,9], [1], [6,11,12], [3,4,5,7,8,10]]
# corresponds to sublists: [[1,1,1] [2], [3,3,3], [4,4,4,4,4,4]]

但是我不知道如何执行此操作,因为大多数解决方案都要求您首先对原始列表进行排序,但是就我而言,这会弄乱索引。 Itertools或np.arrays对此没有帮助,因为它们仅对顺序相等的元素进行分组。

有人知道这个问题的解决方案吗?我很想听听!

6 个答案:

答案 0 :(得分:1)

您可以使用enumerate

original_list = [1,2,1,4,4,4,3,4,4,1,4,3,3]
groups = {a:[i for i, c in enumerate(original_list) if c == a] for a in set(original_list)}

输出:

{1: [0, 2, 9], 2: [1], 3: [6, 11, 12], 4: [3, 4, 5, 7, 8, 10]}

答案 1 :(得分:1)

您可以将collections.defaultdict用于一站式解决方案。然后,根据需要,使用sorted(按期望的结果)按值对索引进行排序。

original_list = [1,2,1,4,4,4,3,4,4,1,4,3,3]

from collections import defaultdict
from operator import itemgetter

dd = defaultdict(list)

for idx, value in enumerate(original_list):
    dd[value].append(idx)

keys, values = zip(*sorted(dd.items(), key=itemgetter(0)))

print(keys, values, sep='\n')

(1, 2, 3, 4)
([0, 2, 9], [1], [6, 11, 12], [3, 4, 5, 7, 8, 10])

为了进行比较,dd的值在Python 3.6+(在3.7+中正式发布,在3.6中作为CPython实现的详细信息)被插入

print(list(dd.values()))

[[0, 2, 9], [1], [3, 4, 5, 7, 8, 10], [6, 11, 12]]

答案 2 :(得分:1)

这是我使用注释中链接的argsort函数对numpy进行处理的方法。

original = [1,2,1,4,4,4,3,4,4,1,4,3,3]
indexes = []
s = set()

for n in np.argsort(original):
    if original[n] in s:
        indexes[-1].append(n)
    else:
        indexes.append([n])
        s.add(original[n])

print(indexes)

答案 3 :(得分:0)

这可以通过列表理解来实现。

>>> x = [1,2,1,4,4,4,3,4,4,1,4,3,3]
>>> [[i for i in range(len(x)) if x[i]==y] for y in sorted(set(x))]
[[0, 2, 9], [1], [6, 11, 12], [3, 4, 5, 7, 8, 10]]

答案 4 :(得分:0)

使用enumeratedefaultdict,您可以使用

构建值到其索引的映射
from collections import defaultdict

dd = defaultdict(list)
for index, value in enumerate(original_list):
    dd[value].append(index)

print(dd)
# defaultdict(<class 'list'>, {1: [0, 2, 9], 2: [1], 4: [3, 4, 5, 7, 8, 10], 3: [6, 11, 12]})

答案 5 :(得分:0)

这是一个线性的时空解决方案,它将索引附加到OrderedDict()中的数字存储桶列表中,并提取索引列表以产生结果:

from collections import OrderedDict

original_list = [9,2,9,4,4,4,3,4,4,9,4,3,3]
counts = OrderedDict()

for i, e in enumerate(original_list):
    if e not in counts:
        counts[e] = []
    counts[e].append(i)

print(list(counts.values()))

输出:

[[0, 2, 9], [1], [6, 11, 12], [3, 4, 5, 7, 8, 10]]

Try it!