l = [{'a': 0}, {'b': 1}, {'c': 2}, {'d': 3}, {'e': 4, 'a': 4}]
d = {k: v for x in l for k, v in x.items()}
print(d)
# {'a': 4, 'b': 1, 'c': 2, 'd': 3, 'e': 4}
import pandas as pd
l1 = [{'id': 9, 'av': 4}, {'id': 10, 'av': 0}, {'id': 8, 'av': 0}]
l2 = [{'id': 9, 'nv': 45}, {'id': 10, 'nv': 0}, {'id': 8, 'nv': 30}]
df1 = pd.DataFrame(l1).set_index('id')
df2 = pd.DataFrame(l2).set_index('id')
df = df1.merge(df2, left_index=True, right_index=True)
df.T.to_dict()
# {9: {'av': 4, 'nv': 45}, 10: {'av': 0, 'nv': 0}, 8: {'av': 0, 'nv': 30}}
# (*) unpacking operator
# for positional vs keyword argument, see "03 functions"
# for packing, see "03 functions"
# * can unpack iterables eg tuple, list, strings etc to its elements.
# ** can only unpack dictionary
# convert range til list
l1 = [range(5)]
print(l1)
#[range(0, 5)]
l = [*range(5)] # * unpacking operator
print(l)
#[0, 1, 2, 3, 4]
# unpacking a collection
my_tuple = (1, 2, 3, 4, 5, 6, 7)
i1, *i2, i3, i4 = my_tuple # the middle part of the tuple gets unpacked into a list in i2
print(i1)
print(i2)
print(i3)
print(i4)
# 1
# [2, 3, 4, 5]
# 6
# 7
# merge containers
my_tuple = (1, 2, 3)
my_list = [4, 5, 6]
merged_list = [*my_tuple, *my_list]
print(merged_list)
# [1, 2, 3, 4, 5, 6]
dict_a = {'a':1, 'b':2}
dict_b = {'c':3, 'd':4}
merged_dict = {**dict_a, **dict_b}
print(merged_dict)
# {'a': 1, 'b': 2, 'c': 3, 'd': 4}
# unpacking arguments passed to function calls
# Ex 1: unpack collections into func arguments
def foo(a, b, *args, **kwargs):
print(a, end = ' ')
for arg in args: #args is unpacked into an iterable object
print(arg, end = ' ')
for key in kwargs:
print(key, kwargs[key], end = ' ')
foo(1, 2, 3, 4, 5, six=6, seven=7)
# 1 3 4 5 six 6 seven 7
values = (1, 2, 3, 4, 5)
mydict = {'eight': 8, 'nine': 9}
foo(*values, **mydict) #NB! * unpacking operator, otherwise passing a tuple + dict
#1 3 4 5 eight 8 nine 9 #NB! ** for dict, otherwise only get keys
# Ex 2: matching parameters with unpacked arguments
def myFun(a, b, c):
print("a:", a)
print("b:", b)
print("c:", c)
# keys in dictionary must be the same as names of parameters
kwargs = {"a" : "One", "b" : "Two", "c" : "Three"} #dictionary
myFun(**kwargs) # passing a dictionary into myFun() by unpacking it and pass individual key:value pair
# a: One
# b: Two
# c: Three