ОБНОВЛЕНИЕ : добавлено упорядочение по длине.
Мы можем использовать расширенную индексацию для создания сетки, индексированной по элементам и меткам.Затем мы можем перебрать столбцы и использовать flatnonzero
для получения идентификаторов элементов:
>>> ex = [[1, 2, 3],
... [1, 0, 0],
... [1, 3, 0]]
>>>
>>> m = len(ex)
>>> n = np.max(ex) + 1
>>> grid = np.zeros((m, n), int) # could also use a smaller dtype here
>>> grid[np.arange(m)[:, None], ex] = 1
>>> grid
array([[0, 1, 1, 1],
[1, 1, 0, 0],
[1, 1, 0, 1]])
>>> idx = np.argsort(np.count_nonzero(grid, 0))[::-1]
>>> dict(zip(idx, map(np.flatnonzero, grid.T[idx])))
{1: array([0, 1, 2]), 3: array([0, 2]), 0: array([1, 2]), 2: array([0])}
Обратите внимание, что словари запоминают порядок вставки своих ключей.Это деталь реализации в 3.6, но гарантированная возможность в 3.7.