How to find common occurrences of dictionary in a list of list of dictionaries
I have a list of list of dictionaries and I want to find the common dictionaries between the two list.
Eg:
dict_list = [[{'1' : 1,'2' : 2, '3' :3}, {'6' : 6,'5' : 5, '4' : 4}],
[{'1' : 1,'2' : 2, '3' :3}, {'7' : 7,'8' : 8, '9' : 9}]]
The result should be [{'1' : 1,'2' : 2, '3' :3}]
I tried using set intersections but dictionaries are unhashable in python.
How to solve this?
python dictionary
add a comment |
I have a list of list of dictionaries and I want to find the common dictionaries between the two list.
Eg:
dict_list = [[{'1' : 1,'2' : 2, '3' :3}, {'6' : 6,'5' : 5, '4' : 4}],
[{'1' : 1,'2' : 2, '3' :3}, {'7' : 7,'8' : 8, '9' : 9}]]
The result should be [{'1' : 1,'2' : 2, '3' :3}]
I tried using set intersections but dictionaries are unhashable in python.
How to solve this?
python dictionary
5
[dict(k) for k,v in Counter(tuple(x.items()) for x in chain.from_iterable(dict_list)).items() if v > 1]
– Chris_Rands
Nov 14 '18 at 11:00
1
@Chris_Rands I didn't see your solution at all when I posted mine. Do you want me to remove it?
– RoadRunner
Nov 14 '18 at 11:13
2
@RoadRunner no don't remove it, people do have the same idea sometimes, thanks for asking though :)
– Chris_Rands
Nov 14 '18 at 11:18
after converting a list of dict to list of tuple, he can use set.intersection too, I guess
– khelili miliana
Nov 14 '18 at 11:21
add a comment |
I have a list of list of dictionaries and I want to find the common dictionaries between the two list.
Eg:
dict_list = [[{'1' : 1,'2' : 2, '3' :3}, {'6' : 6,'5' : 5, '4' : 4}],
[{'1' : 1,'2' : 2, '3' :3}, {'7' : 7,'8' : 8, '9' : 9}]]
The result should be [{'1' : 1,'2' : 2, '3' :3}]
I tried using set intersections but dictionaries are unhashable in python.
How to solve this?
python dictionary
I have a list of list of dictionaries and I want to find the common dictionaries between the two list.
Eg:
dict_list = [[{'1' : 1,'2' : 2, '3' :3}, {'6' : 6,'5' : 5, '4' : 4}],
[{'1' : 1,'2' : 2, '3' :3}, {'7' : 7,'8' : 8, '9' : 9}]]
The result should be [{'1' : 1,'2' : 2, '3' :3}]
I tried using set intersections but dictionaries are unhashable in python.
How to solve this?
python dictionary
python dictionary
edited Nov 14 '18 at 10:57
Zlytherin
1,7071728
1,7071728
asked Nov 14 '18 at 10:54
Perseus14Perseus14
302316
302316
5
[dict(k) for k,v in Counter(tuple(x.items()) for x in chain.from_iterable(dict_list)).items() if v > 1]
– Chris_Rands
Nov 14 '18 at 11:00
1
@Chris_Rands I didn't see your solution at all when I posted mine. Do you want me to remove it?
– RoadRunner
Nov 14 '18 at 11:13
2
@RoadRunner no don't remove it, people do have the same idea sometimes, thanks for asking though :)
– Chris_Rands
Nov 14 '18 at 11:18
after converting a list of dict to list of tuple, he can use set.intersection too, I guess
– khelili miliana
Nov 14 '18 at 11:21
add a comment |
5
[dict(k) for k,v in Counter(tuple(x.items()) for x in chain.from_iterable(dict_list)).items() if v > 1]
– Chris_Rands
Nov 14 '18 at 11:00
1
@Chris_Rands I didn't see your solution at all when I posted mine. Do you want me to remove it?
– RoadRunner
Nov 14 '18 at 11:13
2
@RoadRunner no don't remove it, people do have the same idea sometimes, thanks for asking though :)
– Chris_Rands
Nov 14 '18 at 11:18
after converting a list of dict to list of tuple, he can use set.intersection too, I guess
– khelili miliana
Nov 14 '18 at 11:21
5
5
[dict(k) for k,v in Counter(tuple(x.items()) for x in chain.from_iterable(dict_list)).items() if v > 1]
– Chris_Rands
Nov 14 '18 at 11:00
[dict(k) for k,v in Counter(tuple(x.items()) for x in chain.from_iterable(dict_list)).items() if v > 1]
– Chris_Rands
Nov 14 '18 at 11:00
1
1
@Chris_Rands I didn't see your solution at all when I posted mine. Do you want me to remove it?
– RoadRunner
Nov 14 '18 at 11:13
@Chris_Rands I didn't see your solution at all when I posted mine. Do you want me to remove it?
– RoadRunner
Nov 14 '18 at 11:13
2
2
@RoadRunner no don't remove it, people do have the same idea sometimes, thanks for asking though :)
– Chris_Rands
Nov 14 '18 at 11:18
@RoadRunner no don't remove it, people do have the same idea sometimes, thanks for asking though :)
– Chris_Rands
Nov 14 '18 at 11:18
after converting a list of dict to list of tuple, he can use set.intersection too, I guess
– khelili miliana
Nov 14 '18 at 11:21
after converting a list of dict to list of tuple, he can use set.intersection too, I guess
– khelili miliana
Nov 14 '18 at 11:21
add a comment |
1 Answer
1
active
oldest
votes
A list comprehension could work here:
>>> [x for x in dict_list[0] if x in dict_list[1]]
[{'1': 1, '2': 2, '3': 3}]
But this is not a very general solution, since it assumes only two nested lists are exististent.
A more general solution would be to count the occurences with collections.Counter()
, and storing the dictionary items()
with hashable/immutable types such as frozenset()
or tuple()
. Then all you need to do is filter the occurences that count more than 1.
Example:
>>> from itertools import chain
>>> from collections import Counter
>>> [dict(k) for k, v in Counter(frozenset(x.items()) for x in chain.from_iterable(dict_list)).items() if v > 1]
[{'1': 1, '2': 2, '3': 3}]
Which is very similar to the approach @Chris_Rands posted in the comments.
1
The main point here is that even though dictionaries are not hashable they are comparable. More about comparing dictionaries in python.
– sophros
Nov 14 '18 at 11:01
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53298540%2fhow-to-find-common-occurrences-of-dictionary-in-a-list-of-list-of-dictionaries%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
A list comprehension could work here:
>>> [x for x in dict_list[0] if x in dict_list[1]]
[{'1': 1, '2': 2, '3': 3}]
But this is not a very general solution, since it assumes only two nested lists are exististent.
A more general solution would be to count the occurences with collections.Counter()
, and storing the dictionary items()
with hashable/immutable types such as frozenset()
or tuple()
. Then all you need to do is filter the occurences that count more than 1.
Example:
>>> from itertools import chain
>>> from collections import Counter
>>> [dict(k) for k, v in Counter(frozenset(x.items()) for x in chain.from_iterable(dict_list)).items() if v > 1]
[{'1': 1, '2': 2, '3': 3}]
Which is very similar to the approach @Chris_Rands posted in the comments.
1
The main point here is that even though dictionaries are not hashable they are comparable. More about comparing dictionaries in python.
– sophros
Nov 14 '18 at 11:01
add a comment |
A list comprehension could work here:
>>> [x for x in dict_list[0] if x in dict_list[1]]
[{'1': 1, '2': 2, '3': 3}]
But this is not a very general solution, since it assumes only two nested lists are exististent.
A more general solution would be to count the occurences with collections.Counter()
, and storing the dictionary items()
with hashable/immutable types such as frozenset()
or tuple()
. Then all you need to do is filter the occurences that count more than 1.
Example:
>>> from itertools import chain
>>> from collections import Counter
>>> [dict(k) for k, v in Counter(frozenset(x.items()) for x in chain.from_iterable(dict_list)).items() if v > 1]
[{'1': 1, '2': 2, '3': 3}]
Which is very similar to the approach @Chris_Rands posted in the comments.
1
The main point here is that even though dictionaries are not hashable they are comparable. More about comparing dictionaries in python.
– sophros
Nov 14 '18 at 11:01
add a comment |
A list comprehension could work here:
>>> [x for x in dict_list[0] if x in dict_list[1]]
[{'1': 1, '2': 2, '3': 3}]
But this is not a very general solution, since it assumes only two nested lists are exististent.
A more general solution would be to count the occurences with collections.Counter()
, and storing the dictionary items()
with hashable/immutable types such as frozenset()
or tuple()
. Then all you need to do is filter the occurences that count more than 1.
Example:
>>> from itertools import chain
>>> from collections import Counter
>>> [dict(k) for k, v in Counter(frozenset(x.items()) for x in chain.from_iterable(dict_list)).items() if v > 1]
[{'1': 1, '2': 2, '3': 3}]
Which is very similar to the approach @Chris_Rands posted in the comments.
A list comprehension could work here:
>>> [x for x in dict_list[0] if x in dict_list[1]]
[{'1': 1, '2': 2, '3': 3}]
But this is not a very general solution, since it assumes only two nested lists are exististent.
A more general solution would be to count the occurences with collections.Counter()
, and storing the dictionary items()
with hashable/immutable types such as frozenset()
or tuple()
. Then all you need to do is filter the occurences that count more than 1.
Example:
>>> from itertools import chain
>>> from collections import Counter
>>> [dict(k) for k, v in Counter(frozenset(x.items()) for x in chain.from_iterable(dict_list)).items() if v > 1]
[{'1': 1, '2': 2, '3': 3}]
Which is very similar to the approach @Chris_Rands posted in the comments.
edited Nov 19 '18 at 15:23
answered Nov 14 '18 at 10:59
RoadRunnerRoadRunner
11.2k31340
11.2k31340
1
The main point here is that even though dictionaries are not hashable they are comparable. More about comparing dictionaries in python.
– sophros
Nov 14 '18 at 11:01
add a comment |
1
The main point here is that even though dictionaries are not hashable they are comparable. More about comparing dictionaries in python.
– sophros
Nov 14 '18 at 11:01
1
1
The main point here is that even though dictionaries are not hashable they are comparable. More about comparing dictionaries in python.
– sophros
Nov 14 '18 at 11:01
The main point here is that even though dictionaries are not hashable they are comparable. More about comparing dictionaries in python.
– sophros
Nov 14 '18 at 11:01
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53298540%2fhow-to-find-common-occurrences-of-dictionary-in-a-list-of-list-of-dictionaries%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
5
[dict(k) for k,v in Counter(tuple(x.items()) for x in chain.from_iterable(dict_list)).items() if v > 1]
– Chris_Rands
Nov 14 '18 at 11:00
1
@Chris_Rands I didn't see your solution at all when I posted mine. Do you want me to remove it?
– RoadRunner
Nov 14 '18 at 11:13
2
@RoadRunner no don't remove it, people do have the same idea sometimes, thanks for asking though :)
– Chris_Rands
Nov 14 '18 at 11:18
after converting a list of dict to list of tuple, he can use set.intersection too, I guess
– khelili miliana
Nov 14 '18 at 11:21