Python – Replace value by Kth index value in Dictionary List
Last Updated :
05 Apr, 2023
Given a dictionary list, the task is to write a Python program to replace the value of a particular key with kth index of value if the value of the key is list.
Examples:
Input : test_list = [{‘gfg’ : [5, 7, 9, 1], ‘is’ : 8, ‘good’ : 10}, {‘gfg’ : 1, ‘for’ : 10, ‘geeks’ : 9}, {‘love’ : 3, ‘gfg’ : [7, 3, 9, 1]}], K = 2, key = “gfg”
Output : [{‘gfg’: 9, ‘is’: 8, ‘good’: 10}, {‘gfg’: 1, ‘for’: 10, ‘geeks’: 9}, {‘love’: 3, ‘gfg’: 9}]
Explanation : gfg is assigned with 9 which is 2nd index in list.
Input : test_list = [{‘gfg’ : [5, 7, 9, 1], ‘is’ : 8, ‘good’ : 10}, {‘gfg’ : 1, ‘for’ : 10, ‘geeks’ : 9}], K = 2, key = “gfg”
Output : [{‘gfg’: 9, ‘is’: 8, ‘good’: 10}, {‘gfg’: 1, ‘for’: 10, ‘geeks’: 9}]
Explanation : gfg is assigned with 9 which is 2nd index in list.
Method #1 : Using loop + isinstance()
Use isinstance() to check for list type of values and loop is used to iterate through dictionaries.
Step-by-step approach :
- Loop over each dictionary sub in the list test_list.
- Use the isinstance() function to check if the value corresponding to the key key is a list in the current dictionary sub.
- If the value is a list, update the value corresponding to the key key with the Kth element of the list.
- Print the modified list of dictionaries test_list.
Below is the implementation of the above approach:
Python3
test_list = [{ 'gfg' : [ 5 , 7 , 9 , 1 ], 'is' : 8 , 'good' : 10 },
{ 'gfg' : 1 , 'for' : 10 , 'geeks' : 9 },
{ 'love' : 3 , 'gfg' : [ 7 , 3 , 9 , 1 ]}]
print ( "The original list is : " + str (test_list))
K = 2
key = "gfg"
for sub in test_list:
if isinstance (sub[key], list ):
sub[key] = sub[key][K]
print ( "The Modified Dictionaries : " + str (test_list))
|
Output
The original list is : [{'gfg': [5, 7, 9, 1], 'is': 8, 'good': 10}, {'gfg': 1, 'for': 10, 'geeks': 9}, {'love': 3, 'gfg': [7, 3, 9, 1]}]
The Modified Dictionaries : [{'gfg': 9, 'is': 8, 'good': 10}, {'gfg': 1, 'for': 10, 'geeks': 9}, {'love': 3, 'gfg': 9}]
Time Complexity: O(n)
Auxiliary Space: O(1)
Method #2 : Using dictionary comprehension + isinstance()
In this, we reconstruct dictionaries with modified dictionary values using isinstance() and dictionary comprehension is used to form intermediate dictionaries.
Python3
test_list = [{ 'gfg' : [ 5 , 7 , 9 , 1 ], 'is' : 8 , 'good' : 10 },
{ 'gfg' : 1 , 'for' : 10 , 'geeks' : 9 },
{ 'love' : 3 , 'gfg' : [ 7 , 3 , 9 , 1 ]}]
print ( "The original list is : " + str (test_list))
K = 2
key = "gfg"
res = [{newkey: (val[K] if isinstance (val, list ) and newkey = = key else val)
for newkey, val in sub.items()} for sub in test_list]
print ( "The Modified Dictionaries : " + str (res))
|
Output
The original list is : [{'gfg': [5, 7, 9, 1], 'is': 8, 'good': 10}, {'gfg': 1, 'for': 10, 'geeks': 9}, {'love': 3, 'gfg': [7, 3, 9, 1]}]
The Modified Dictionaries : [{'gfg': 9, 'is': 8, 'good': 10}, {'gfg': 1, 'for': 10, 'geeks': 9}, {'love': 3, 'gfg': 9}]
Time Complexity: O(n)
Auxiliary Space: O(1)
Method 3: Modifying the original list in-place using a list comprehension:
This approach uses a list comprehension to create a new list of dictionaries with the specified key updated at index K, and then assigns the new list back to the original variable to modify it in-place. The output of this code should match exactly with the original program.
Python3
test_list = [{ 'gfg' : [ 5 , 7 , 9 , 1 ], 'is' : 8 , 'good' : 10 },
{ 'gfg' : 1 , 'for' : 10 , 'geeks' : 9 },
{ 'love' : 3 , 'gfg' : [ 7 , 3 , 9 , 1 ]}]
print ( "The original list is : " + str (test_list))
K = 2
key = "gfg"
test_list = [{k: (v[K] if k = = key and isinstance (v, list ) else v) for k, v in d.items()} for d in test_list]
print ( "The Modified Dictionaries : " + str (test_list))
|
Output
The original list is : [{'gfg': [5, 7, 9, 1], 'is': 8, 'good': 10}, {'gfg': 1, 'for': 10, 'geeks': 9}, {'love': 3, 'gfg': [7, 3, 9, 1]}]
The Modified Dictionaries : [{'gfg': 9, 'is': 8, 'good': 10}, {'gfg': 1, 'for': 10, 'geeks': 9}, {'love': 3, 'gfg': 9}]
Time Complexity: O(n)
Auxiliary Space: O(n)
Method #4: Using for loop and try-except block
we can use a for loop to iterate over the dictionaries in the list, and a try-except block to check if the key is present and if the value is a list. If the conditions are satisfied, we can replace the value with the K-th element of the list.
Python3
test_list = [{ 'gfg' : [ 5 , 7 , 9 , 1 ], 'is' : 8 , 'good' : 10 },
{ 'gfg' : 1 , 'for' : 10 , 'geeks' : 9 },
{ 'love' : 3 , 'gfg' : [ 7 , 3 , 9 , 1 ]}]
print ( "The original list is : " + str (test_list))
K = 2
key = "gfg"
for d in test_list:
try :
if isinstance (d[key], list ):
d[key] = d[key][K]
except KeyError:
pass
print ( "The Modified Dictionaries : " + str (test_list))
|
Output
The original list is : [{'gfg': [5, 7, 9, 1], 'is': 8, 'good': 10}, {'gfg': 1, 'for': 10, 'geeks': 9}, {'love': 3, 'gfg': [7, 3, 9, 1]}]
The Modified Dictionaries : [{'gfg': 9, 'is': 8, 'good': 10}, {'gfg': 1, 'for': 10, 'geeks': 9}, {'love': 3, 'gfg': 9}]
Time complexity: O(nm)
Where n is the number of dictionaries in the list and m is the maximum number of keys in any dictionary. This is because we need to iterate over each dictionary in the list and check each key to see if it matches the given key and whether the value is a list.
Auxiliary space: O(1)
Because we are not creating any additional data structures. We are only modifying the existing list in place.
Method #5: Using map() function and lambda expression
- Initialize the original list test_list with the given dictionaries.
- Print the original list.
- Initialize the index K with the given value. Initialize the key with the given value.
- Use the map() function to modify the original list in place.
- The map() function takes two arguments: a function and an iterable. In this case, the function is a lambda expression that modifies each sub-dictionary in the list. The iterable is the original list itself.
- The lambda expression checks if the value of the key is a list. If it is, then it updates the value of the key to be the Kth index value of the list. Otherwise, it does nothing.
- The map() function returns an iterator that applies the lambda function to each element of the list. However, since we don’t need the iterator, we discard it using the list() function.
- Print the modified list.
Python3
test_list = [{ 'gfg' : [ 5 , 7 , 9 , 1 ], 'is' : 8 , 'good' : 10 },
{ 'gfg' : 1 , 'for' : 10 , 'geeks' : 9 },
{ 'love' : 3 , 'gfg' : [ 7 , 3 , 9 , 1 ]}]
print ( "The original list is : " + str (test_list))
K = 2
key = "gfg"
list ( map ( lambda sub: sub.update({key: sub[key][K]}) if isinstance (
sub[key], list ) else None , test_list))
print ( "The Modified Dictionaries : " + str (test_list))
|
Output
The original list is : [{'gfg': [5, 7, 9, 1], 'is': 8, 'good': 10}, {'gfg': 1, 'for': 10, 'geeks': 9}, {'love': 3, 'gfg': [7, 3, 9, 1]}]
The Modified Dictionaries : [{'gfg': 9, 'is': 8, 'good': 10}, {'gfg': 1, 'for': 10, 'geeks': 9}, {'love': 3, 'gfg': 9}]
Time complexity: O(n), where n is the length of the list.
Auxiliary space: O(1), as the modification is done in-place without any additional data structure.
Share your thoughts in the comments
Please Login to comment...