簡體   English   中英

從列表創建等值索引的子列表

[英]Create sublists of indexes of equal values from 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 對我沒有幫助,因為它們只對順序相等的元素進行分組。

有誰知道這個問題的解決方案? 我很想聽聽!

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

使用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]})

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

這是我將如何使用 numpy 進行操作,使用我在評論中鏈接的 argsort 函數。

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)

這可以通過列表理解來實現。

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

這是一個線性時間和空間解決方案,它將索引附加到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]]

試試吧!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM