Создайте подсписки индексов равных значений из списка - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь разбить список целых чисел на подсписки индексов равных целых чисел.Скажем, у меня есть список:

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 голосов
/ 04 декабря 2018

Вот как я бы сделал это с помощью 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)
0 голосов
/ 04 декабря 2018

Вот линейное решение времени и пространства, которое добавляет индексы к спискам числовых списков в 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]]

Попробуйте!

0 голосов
/ 04 декабря 2018

Вы можете использовать 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+, как подробности реализации CPython в 3.6):

print(list(dd.values()))

[[0, 2, 9], [1], [3, 4, 5, 7, 8, 10], [6, 11, 12]]
0 голосов
/ 04 декабря 2018

Используя enumerate и defaultdict, вы можете построить отображение значений на их индексы с помощью

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]})
0 голосов
/ 04 декабря 2018

Этого можно достичь с помощью понимания списка.

>>> 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]]
0 голосов
/ 04 декабря 2018

Вы можете использовать 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]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...