2 votes

Créer des sous-listes d'index de valeurs égales à partir de la liste

J'essaie de diviser une liste d'entiers en sous-listes d'index d'entiers égaux. Disons que j'ai une liste :

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

Le résultat souhaité est le suivant :

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

Je n'arrive pas à comprendre comment faire, car la plupart des solutions exigent que l'on trie d'abord la liste originale, mais dans mon cas, cela perturbe les indices. Itertools ou np.arrays ne m'ont pas aidé pour cette raison, car ils ne regroupent que des éléments séquentiels égaux.

Quelqu'un connaît-il une solution à ce problème ? J'aimerais beaucoup en savoir plus !

1voto

Ajax1234 Points 42210

Vous pouvez utiliser 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)}

Sortie :

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

1voto

Patrick Haugh Points 27866

Utilisation enumerate y un defaultdict vous pouvez construire une correspondance entre les valeurs et leurs indices avec

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

1voto

jpp Points 83462

Vous pouvez utiliser collections.defaultdict pour une solution en un seul passage. Utilisez ensuite sorted si vous avez besoin, comme dans votre résultat souhaité, de trier vos indices par valeur.

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

À titre de comparaison, les valeurs de dd sont insertion commandée en Python 3.6+ (officiellement en 3.7+, en tant que détail d'implémentation de CPython en 3.6) :

print(list(dd.values()))

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

1voto

ninesalt Points 1116

Voici comment je ferais avec numpy, en utilisant la fonction argsort dont j'ai donné le lien dans les commentaires.

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)

0voto

Xero Smith Points 964

Pour ce faire, il est possible d'utiliser une liste de compréhension.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X