How to find common occurrences of dictionary in a list of list of dictionaries












1















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?










share|improve this question




















  • 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


















1















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?










share|improve this question




















  • 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
















1












1








1








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?










share|improve this question
















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






share|improve this question















share|improve this question













share|improve this question




share|improve this question








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
















  • 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














1 Answer
1






active

oldest

votes


















3














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.






share|improve this answer





















  • 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













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
});


}
});














draft saved

draft discarded


















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









3














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.






share|improve this answer





















  • 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


















3














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.






share|improve this answer





















  • 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
















3












3








3







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.






share|improve this answer















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.







share|improve this answer














share|improve this answer



share|improve this answer








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
















  • 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




















draft saved

draft discarded




















































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.




draft saved


draft discarded














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





















































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







Popular posts from this blog

Xamarin.iOS Cant Deploy on Iphone

Glorious Revolution

Dulmage-Mendelsohn matrix decomposition in Python