Given two list of dictionaries, compute frequency corresponding to each value in dictionary 1 to second.
Input : test_list1 = [{“Gfg” : 6}, {“best” : 10}], test_list2 = [{“a” : 6}, {“b” : 10}, {“d” : 6}}]
Output : {‘Gfg’: 2, ‘best’: 1}
Explanation : 6 has 2 occurrence in 2nd list, 10 has 1.Input : test_list1 = [{“Gfg” : 6}], test_list2 = [{“a” : 6}, {“b” : 6}, {“d” : 6}}]
Output : {‘Gfg’: 3}
Explanation : 6 has 3 occurrence in 2nd list.
Method #1: Using dictionary comprehension + count() + list comprehension
The combination of above functionalities can be used to solve this problem. In this, we perform this task using 2 steps, in first we extract all values from second list, and then perform mapping with frequency with first dictionary using list comprehension and count().
Python3
# Python3 code to demonstrate working of # Values frequency across Dictionaries lists # Using list comprehension + dictionary comprehension + count() # initializing lists test_list1 = [{ "Gfg" : 6 }, { "is" : 9 }, { "best" : 10 }] test_list2 = [{ "a" : 6 }, { "b" : 10 }, { "c" : 9 }, { "d" : 6 }, { "e" : 9 }, { "f" : 9 }] # printing original list print ( "The original list 1 : " + str (test_list1)) print ( "The original list 2 : " + str (test_list2)) # extracting values from target dictionary temp = [val for sub in test_list2 for key, val in sub.items()] # frequency mapping from 1st dictionary keys res = {key : temp.count(val) for sub in test_list1 for key, val in sub.items()} # printing result print ( "The frequency dictionary : " + str (res)) |
The original list 1 : [{'Gfg': 6}, {'is': 9}, {'best': 10}] The original list 2 : [{'a': 6}, {'b': 10}, {'c': 9}, {'d': 6}, {'e': 9}, {'f': 9}] The frequency dictionary : {'Gfg': 2, 'is': 3, 'best': 1}
Time complexity: O(n^2), where n is the total number of elements in both the input lists.
Auxiliary space: O(n), where n is the total number of elements in both the input lists.
Method #2: Using dictionary comprehension + operator.countOf() + list comprehension
The combination of above functionalities can be used to solve this problem. In this, we perform this task using 2 steps, in first we extract all values from second list, and then perform mapping with frequency with first dictionary using list comprehension and operator.countOf().
Python3
# Python3 code to demonstrate working of # Values frequency across Dictionaries lists # Using list comprehension + dictionary comprehension + operator.countOf() import operator as op # initializing lists test_list1 = [{ "Gfg" : 6 }, { "is" : 9 }, { "best" : 10 }] test_list2 = [{ "a" : 6 }, { "b" : 10 }, { "c" : 9 }, { "d" : 6 }, { "e" : 9 }, { "f" : 9 }] # printing original list print ( "The original list 1 : " + str (test_list1)) print ( "The original list 2 : " + str (test_list2)) # extracting values from target dictionary temp = [val for sub in test_list2 for key, val in sub.items()] # frequency mapping from 1st dictionary keys res = {key : op.countOf(temp,val) for sub in test_list1 for key, val in sub.items()} # printing result print ( "The frequency dictionary : " + str (res)) |
The original list 1 : [{'Gfg': 6}, {'is': 9}, {'best': 10}] The original list 2 : [{'a': 6}, {'b': 10}, {'c': 9}, {'d': 6}, {'e': 9}, {'f': 9}] The frequency dictionary : {'Gfg': 2, 'is': 3, 'best': 1}
Time Complexity: O(n)
Auxiliary Space: O(n)
Method 3: Using a nested for loop
This program counts the frequency of values from the first list of dictionaries in the second list of dictionaries, and stores the results in a dictionary. The output is the frequency dictionary.
Python3
# Python3 code to demonstrate working of # Values frequency across Dictionaries lists # Using nested for loop # initializing lists test_list1 = [{ "Gfg" : 6 }, { "is" : 9 }, { "best" : 10 }] test_list2 = [{ "a" : 6 }, { "b" : 10 }, { "c" : 9 }, { "d" : 6 }, { "e" : 9 }, { "f" : 9 }] # printing original list print ( "The original list 1 : " + str (test_list1)) print ( "The original list 2 : " + str (test_list2)) # empty dictionary to store the result res = {} # iterate through each dictionary in test_list1 for dict1 in test_list1: # iterate through each key-value pair in the dictionary for key1, val1 in dict1.items(): count = 0 # iterate through each dictionary in test_list2 for dict2 in test_list2: # iterate through each key-value pair in the dictionary for key2, val2 in dict2.items(): # check if the value is equal to the value in test_list1 if val2 = = val1: count + = 1 res[key1] = count # printing result print ( "The frequency dictionary : " + str (res)) |
The original list 1 : [{'Gfg': 6}, {'is': 9}, {'best': 10}] The original list 2 : [{'a': 6}, {'b': 10}, {'c': 9}, {'d': 6}, {'e': 9}, {'f': 9}] The frequency dictionary : {'Gfg': 2, 'is': 3, 'best': 1}
Time complexity: O(n^3), where n is the length of the longer of the two input lists.
Auxiliary space: O(1) or constant.
Method #6: Using defaultdict
Another way to solve this problem is by using the defaultdict class from the collections module.
Step by step:
- Import the defaultdict class from the collections module.
- Initialize a defaultdict object with a default value of 0.
- Use a nested for loop to iterate through each dictionary in test_list1 and each key-value pair in the dictionary.
- Inside the nested for loop, use another nested for loop to iterate through each dictionary in test_list2 and each key-value pair in the dictionary.
- Check if the value of the current key-value pair in test_list1 is equal to the value of the current key-value pair in test_list2.
- If the values are equal, increment the corresponding key in the defaultdict object by 1.
- Convert the defaultdict object to a regular dictionary using the dict() constructor.
- Print the resulting dictionary.
Python3
from collections import defaultdict # initializing lists test_list1 = [{ "Gfg" : 6 }, { "is" : 9 }, { "best" : 10 }] test_list2 = [{ "a" : 6 }, { "b" : 10 }, { "c" : 9 }, { "d" : 6 }, { "e" : 9 }, { "f" : 9 }] # initialize a defaultdict object with a default value of 0 res = defaultdict( int ) # iterate through each dictionary in test_list1 for dict1 in test_list1: # iterate through each key-value pair in the dictionary for key1, val1 in dict1.items(): # iterate through each dictionary in test_list2 for dict2 in test_list2: # iterate through each key-value pair in the dictionary for key2, val2 in dict2.items(): # check if the value is equal to the value in test_list1 if val2 = = val1: # increment the corresponding key in the defaultdict object by 1 res[key1] + = 1 # convert the defaultdict object to a regular dictionary res = dict (res) # print the resulting dictionary print ( "The frequency dictionary : " + str (res)) |
The frequency dictionary : {'Gfg': 2, 'is': 3, 'best': 1}
Time complexity: O(n^2), where n is the length of test_list1 multiplied by the length of test_list2.
Auxiliary space: O(k), where k is the number of unique values in test_list1.