Создать вложенный словарь, который группирует элементы в три ndarrays - PullRequest
0 голосов
/ 28 января 2020

Я хочу создать словарь, который содержит информацию в трех ndarrays того же измерения, таких как:

import numpy as np
name = np.array(['a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c'])
pid = np.array([1, 1, 2, 2, 2, 3, 4, 4, 4, 5, 5, 6, 7, 7, 7, 8])
dev = np.array([11, 12, 21, 22, 23, 31, 11, 42, 31, 51, 52, 61, 71, 72, 73, 81])

Желаемый вывод должен быть что-то вроде:

 alldevs = {
        'a': {
            1: [11, 12]
            2: [21, 22, 22]
            3: [31]
            }
        'b': {
            4: [11, 42, 31],
            5: [51, 52],
            6: [61]
            }
        'c': {
            7: [71, 72, 73],
            8: [81]
            }
        }

Пока что у меня есть:

allDevs = {a:{b:[c]} for a,b,c in zip(name,pid,dev)}

, который дает только последнюю из каждой группы, но не группирует все значения в dev, которые разделяют name и pid:

 {'a': {3: [31]}, 'b': {6: [61]}, 'c': {8: [81]}}

Я нашел это Создал вложенный словарь из трех отдельных списков , но он не выполняет то, что я хочу.

Ответы [ 3 ]

2 голосов
/ 28 января 2020

Если вы хотите посмотреть, как производится колбаса:

allDevs = dict()
for a,b,c in zip(name,pid,dev):
    if a not in allDevs:
        allDevs[a] = dict()
    if b not in allDevs[a]:
        allDevs[a][b] = [c]
    else:
        allDevs[a][b].append(c)
2 голосов
/ 28 января 2020

Это можно сделать с помощью itertools.groupby и operator.itemgetter:

{n: {p: list(map(itemgetter(2), d)) for p, d in groupby(g, itemgetter(1))} 
        for n, g in groupby(zip(name, pid, dev), itemgetter(0))}

Результаты:

{'a': {1: [11, 12], 2: [21, 22, 23], 3: [31]}, 
 'b': {4: [11, 42, 31], 5: [51, 52], 6: [61]}, 
 'c': {7: [71, 72, 73], 8: [81]}}
2 голосов
/ 28 января 2020

Вы можете использовать itertools.groupby для группировки элементов из массивов (при условии, что они отсортированы):

import numpy as np
from itertools import groupby 

name = np.array(['a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c'])
pid = np.array([1, 1, 2, 2, 2, 3, 4, 4, 4, 5, 5, 6, 7, 7, 7, 8])
dev = np.array([11, 12, 21, 22, 23, 31, 11, 42, 31, 51, 52, 61, 71, 72, 73, 81])

alldevs = {}
for (n, p), g in groupby(zip(name, pid, dev), lambda k: (k[0], k[1])):
    for _, _, d in g:
        alldevs.setdefault(n, {}).setdefault(p, []).append(d)

from pprint import pprint
pprint(alldevs)

Отпечатки:

{'a': {1: [11, 12], 2: [21, 22, 23], 3: [31]},
 'b': {4: [11, 42, 31], 5: [51, 52], 6: [61]},
 'c': {7: [71, 72, 73], 8: [81]}}
...