Создать подгруппы с позицией элемента из списка - PullRequest
0 голосов
/ 27 июня 2018

Мне нужно создать подгруппы с позицией элемента из списка на основе значения элементов, что означает, что подгруппы будут содержать одинаковые элементы из списка.

Однако размер подгруппы будет зависеть от значения группы.

Пример: A = [2,1,1,2,1] создаст [0, 3] [1] [2] [4]

Я написал следующий код. Тем не менее, все тесты не проходят успешно.

Я не получаю правильный вывод, если A = [2,1,2,1,2,2]. Для моего случая я получаю:

0 2
4 5
1
3

Однако ожидается:

0 2
1
3
4 5

Ниже мой код:

A = [2,1,1,2,1]
uniqueCounts = []
for x in A:
    if x not in uniqueCounts:
        uniqueCounts.append(x)

for i in range(len(uniqueCounts)):
    n = uniqueCounts[i]
    p = [i for i,x in enumerate(A) if x == n]

    if(len(p)==1):
        print(*p)
    else:
        q = int(len(p)/n)
        count = 0
        c = 0
        while count < q:
            print(*p[c:n+c])
            c = c + n
            count = count + 1

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Сначала отсортируйте список A только с уникальными элементами. без потери заказа. Затем найдите все индексы для элементов в отсортированном списке из исходного списка

A = [2,1,1,2,1]
sortedA = sorted(set(A), key=A.index)
# [2, 1]

[[i for i,x in enumerate(A) if x==e] for e in sortedA]
# [[0, 3], [1, 2, 4]]
0 голосов
/ 27 июня 2018

Вы должны использовать numpy и функцию np.where():

import numpy as np

A = [2,1,1,2,1]
A = np.asarray(A)
ID = np.where(A == 2)[0]

Выход:

ID = array([0, 3], dtype=int64)

Затем вы можете работать с этим массивом, чтобы преобразовать его в список, сосчитать количество элементов, используя shape или len ... и т. Д.

Чтобы вернуться к вашему коду:

A = [2,1,1,2,1]
uniqueCounts = list(set(A))

set возвращает набор без дубликатов. преобразование его в список дает вам уникальные счета напрямую.

Вывод:

A = [2,1,1,2,1]
uniqueCounts = list(set(A))
A = np.asarray(A)

subgroup = list()

for elt in uniqueCounts:
    subgroup.append(tuple(np.where(A == elt)[0]))

Для получения желаемого результата все еще требуется определенная работа, я дам вам это:)

...