Merging multiple dictionaries with dictionaries

조회 수: 14 (최근 30일)
James
James 2025년 7월 12일
댓글: James 2025년 7월 12일
Related to this question, how can one merge two dictionaries that have dictionaries as the keys and values?
A = dictionary(dictionary(["key1"], {1}), dictionary(["key2"], {2}));
A(dictionary(["key3"], {3})) = dictionary(["key4"], {4})
A = dictionary (dictionary --> dictionary) with 2 entries: dictionary (string --> cell) with 1 entry --> dictionary (string --> cell) with 1 entry dictionary (string --> cell) with 1 entry --> dictionary (string --> cell) with 1 entry
B = dictionary(dictionary(["key5"], {5}), dictionary(["key6"], {6}));
B(dictionary(["key7"], {7})) = dictionary(["key8"], {8})
B = dictionary (dictionary --> dictionary) with 2 entries: dictionary (string --> cell) with 1 entry --> dictionary (string --> cell) with 1 entry dictionary (string --> cell) with 1 entry --> dictionary (string --> cell) with 1 entry
C = dictionary(A.keys, A.values)
Error using dictionary/keys
Unable to combine keys of type 'dictionary'. Specify the format option as "cell".
C(B.keys) = B.values

채택된 답변

Matt J
Matt J 2025년 7월 12일
A = dictionary(dictionary(["key1"], {1}), dictionary(["key2"], {2}));
A(dictionary(["key3"], {3})) = dictionary(["key4"], {4});
B = dictionary(dictionary(["key5"], {5}), dictionary(["key6"], {6}));
B(dictionary(["key7"], {7})) = dictionary(["key8"], {8});
kv = [keys(A, "cell")', keys(B, "cell")';
values(A, "cell")', values(B, "cell")'];
C=dictionary(kv{:})
C = dictionary (dictionary --> dictionary) with 4 entries: dictionary (string --> cell) with 1 entry --> dictionary (string --> cell) with 1 entry dictionary (string --> cell) with 1 entry --> dictionary (string --> cell) with 1 entry dictionary (string --> cell) with 1 entry --> dictionary (string --> cell) with 1 entry dictionary (string --> cell) with 1 entry --> dictionary (string --> cell) with 1 entry
  댓글 수: 3
Matt J
Matt J 2025년 7월 12일
편집: Matt J 2025년 7월 12일
But understand that if you now want to loop over the entries of C, you will need an array of its keys. Because the keys are dictionaries, the array will have to be in cell form:
k=[keys(A, "cell"); keys(B, "cell")];
v=[values(A, "cell"); values(B, "cell")];
%% noncell key/values
kv=[k';v'];
C=dictionary(kv{:})
C = dictionary (dictionary --> dictionary) with 4 entries: dictionary (string --> cell) with 1 entry --> dictionary (string --> cell) with 1 entry dictionary (string --> cell) with 1 entry --> dictionary (string --> cell) with 1 entry dictionary (string --> cell) with 1 entry --> dictionary (string --> cell) with 1 entry dictionary (string --> cell) with 1 entry --> dictionary (string --> cell) with 1 entry
for i=1:numel(k)
d=C(k{i})
end
d = dictionary (string --> cell) with 1 entry: "key2" --> {[2]} d = dictionary (string --> cell) with 1 entry: "key4" --> {[4]} d = dictionary (string --> cell) with 1 entry: "key6" --> {[6]} d = dictionary (string --> cell) with 1 entry: "key8" --> {[8]}
But you could have implemented the same loop, with less code, by accepting cell-valued dictionary entries:
%% cell key/values
C=dictionary(k,v)
C = dictionary (cell --> cell) with 4 entries: {[dictionary (string --> cell) with 1 entry]} --> {[dictionary (string --> cell) with 1 entry]} {[dictionary (string --> cell) with 1 entry]} --> {[dictionary (string --> cell) with 1 entry]} {[dictionary (string --> cell) with 1 entry]} --> {[dictionary (string --> cell) with 1 entry]} {[dictionary (string --> cell) with 1 entry]} --> {[dictionary (string --> cell) with 1 entry]}
for i=1:numel(k)
d=C{k(i)}
end
d = dictionary (string --> cell) with 1 entry: "key2" --> {[2]} d = dictionary (string --> cell) with 1 entry: "key4" --> {[4]} d = dictionary (string --> cell) with 1 entry: "key6" --> {[6]} d = dictionary (string --> cell) with 1 entry: "key8" --> {[8]}
James
James 2025년 7월 12일
Thanks for explaining

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Matt J
Matt J 2025년 7월 12일
f=@(i) {dictionary(["key"+i], {i})}
f = function_handle with value:
@(i){dictionary(["key"+i],{i})}
A = dictionary(f(1), f(2));
A(f(3)) = f(4)
A = dictionary (cell --> cell) with 2 entries: {[dictionary (string --> cell) with 1 entry]} --> {[dictionary (string --> cell) with 1 entry]} {[dictionary (string --> cell) with 1 entry]} --> {[dictionary (string --> cell) with 1 entry]}
B = dictionary(f(5), f(6));
B(f(7)) = f(8)
B = dictionary (cell --> cell) with 2 entries: {[dictionary (string --> cell) with 1 entry]} --> {[dictionary (string --> cell) with 1 entry]} {[dictionary (string --> cell) with 1 entry]} --> {[dictionary (string --> cell) with 1 entry]}
C = dictionary(A.keys, A.values)
C = dictionary (cell --> cell) with 2 entries: {[dictionary (string --> cell) with 1 entry]} --> {[dictionary (string --> cell) with 1 entry]} {[dictionary (string --> cell) with 1 entry]} --> {[dictionary (string --> cell) with 1 entry]}
C(B.keys) = B.values
C = dictionary (cell --> cell) with 4 entries: {[dictionary (string --> cell) with 1 entry]} --> {[dictionary (string --> cell) with 1 entry]} {[dictionary (string --> cell) with 1 entry]} --> {[dictionary (string --> cell) with 1 entry]} {[dictionary (string --> cell) with 1 entry]} --> {[dictionary (string --> cell) with 1 entry]} {[dictionary (string --> cell) with 1 entry]} --> {[dictionary (string --> cell) with 1 entry]}
  댓글 수: 12
Matt J
Matt J 2025년 7월 12일
편집: Matt J 2025년 7월 12일
Maybe I don't have a necessary understanding of where the original dictionaries are coming from. Even before A, B are created, you apparently have a collection of multiple dictionaries from which A and B will be built. How are you holding this collection together?
It has to be with a cell array, becacuse again, dictionaries cannot be concatenated by themselves.There is no other way to maintain an array of dictionaries. And if the key/value dictionaries are already in cell form, why not continue to use them in that form?
James
James 2025년 7월 12일
You gave me a lot to think about. I'm going to rework my dictionaries, however, to answer my question I posted a solution with a loop. Probably not optimal but it maintains the structure without the use of cell arrays.

댓글을 달려면 로그인하십시오.


James
James 2025년 7월 12일
A = dictionary(dictionary(["key1"], {1}), dictionary(["key2"], {2}));
A(dictionary(["key3"], {3})) = dictionary(["key4"], {4})
A = dictionary (dictionary --> dictionary) with 2 entries: dictionary (string --> cell) with 1 entry --> dictionary (string --> cell) with 1 entry dictionary (string --> cell) with 1 entry --> dictionary (string --> cell) with 1 entry
B = dictionary(dictionary(["key5"], {5}), dictionary(["key6"], {6}));
B(dictionary(["key7"], {7})) = dictionary(["key8"], {8})
B = dictionary (dictionary --> dictionary) with 2 entries: dictionary (string --> cell) with 1 entry --> dictionary (string --> cell) with 1 entry dictionary (string --> cell) with 1 entry --> dictionary (string --> cell) with 1 entry
C = dictionary;
k = keys(A, "cell");
for i = 1:length(k)
C = insert(C, cell2mat(k(i)), A(cell2mat(k(i))));
end
k = keys(B, "cell");
for i = 1:length(k)
C = insert(C, cell2mat(k(i)), B(cell2mat(k(i))));
end
C
C = dictionary (dictionary --> dictionary) with 4 entries: dictionary (string --> cell) with 1 entry --> dictionary (string --> cell) with 1 entry dictionary (string --> cell) with 1 entry --> dictionary (string --> cell) with 1 entry dictionary (string --> cell) with 1 entry --> dictionary (string --> cell) with 1 entry dictionary (string --> cell) with 1 entry --> dictionary (string --> cell) with 1 entry

카테고리

Help CenterFile Exchange에서 Whos에 대해 자세히 알아보기

태그

제품


릴리스

R2025a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by