Open In App

Python – Values frequency across Dictionaries lists

Last Updated : 13 Apr, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

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


Output

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


Output

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


Output

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


Output

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.



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads