# How to Sort a Dictionary by Value in Python

I have implemented the sorting of dictionary using the for loop and lambda function using the Test Driven Data / TDD approach.
Here is the simple code.

``````

"""
@Author: Aseem Jain
@Github: https://github.com/premaseem/pythonLab/tree/master/challenge

Sort map/dictionary by keys and values

"""

def sol(m):
s_k ={}
s_v ={}
# On 1
for k in sorted(m.keys()):
s_k[k] = m.get(k)

for v in sorted(m.values()):
for k in m:
if v == m.get(k):
s_v[k] = v

return (s_k,s_v)

def sol1(m):
s_k_t = sorted(m.items(),key=lambda i:i[0])
s_v_t = sorted(m.items(),key=lambda i:i[1])

s_k_m = {}
for k,v in s_k_t: s_k_m[k]=v

s_v_m = {}
for k,v in s_v_t: s_v_m[k]=v

return (s_k_m,s_v_m)

def sol2(m):
s_k_t = sorted(m.items(),key=lambda i:i[0])
s_v_t = sorted(m.items(),key=lambda i:i[1])
def tuple_to_map(t):
new_m = {}
for k,v in t:
new_m[k]=v
return new_m
return (tuple_to_map(s_k_t),tuple_to_map(s_v_t))

# Test with given map and expected sorted values
map = { 3:15, 0:10, 5:50, 7:25 }
sorted_key = { 0:10, 3:15, 5:50, 7:25 }
sorted_values = { 5:50, 7:25, 0:10, 3:15}

test_data = [
(map, (sorted_key,sorted_values) )
]

for given, expected in test_data:
assert sol(given) == expected
assert sol1(given) == expected
print(f"Test passed for: given {given} and expected = {expected}")
``````

# Python: Data driven testing

I love doing TDD – Test driven development.

Sharing a small code construct to include variety of data set in a concise manner without depending on any library

``````def double(n):
return n*2

test_data = [
(2 ,4),
(4 ,8),
]

for given, expected in test_data:
assert expected == double(given)
print(f"Test passed for: given {given} and expected = {expected}")``````

Output on console
Test passed for: given 2 and expectation = 4
Test passed for: given 4 and expectation = 8

# Python script to take mongodb backup

`"""@Author: Aseem Jain@profile: https://www.linkedin.com/in/premaseem/"""import osimport pymongo# configure credentials / db namedb_user = os.environ["MONGO_ATLAS_USER"]db_pass = os.environ["MONGO_ATLAS_PASSWORD"]db_name = "sample_mflix"connection_string = f"mongodb+srv://{db_user}:{db_pass}@sharedcluster.lv3wx.mongodb.net/{db_name}?retryWrites=true&w=majority"client = pymongo.MongoClient(connection_string)db = client[db_name]# create database back directory with db_nameos.makedirs(db_name, exist_ok=True)# list all tables in databasetables = db.list_collection_names()# dump all tables in dbfor table in tables:    print("exporting data for table", table )    data = list(db[table].find())    # write data in json file    with open(f"{db.name}/{table}.json","w") as writer:        writer.write(str(data))exit(0)`

# User defined custom object sorting in python

`"""@Author: Aseem Jain@profile: https://www.linkedin.com/in/premaseem/Title: Sort the class or custom object and not regular int / string using in build sort funcitonsSort custom object can be done in 2 ways1. Static way : class implementing < less then __lt__(self,other)2. Dynamic way is by providing lambda func with key."""class User:    def __init__(self,name,age):        self.name = name        self.age = age    def __repr__(self):        return self.name + str(self.age)    def __lt__(self, other):        return self.age < other.age# Sorting Stringls = ["zeema", "aseemjain", "see",str(3),str(13),"\$\$"]ls.sort()print(ls)#output: ['\$\$', '3', 'aseemjain', 'see', 'zeema']# Reverse soringls.sort(reverse=True)print(ls)# output: ['zeema', 'see', 'aseemjain', '3', '\$\$']# sorting Custom objectusers = [User("aseem",16),User("aseemprem",56),User("premaseem",23),User("zseem",36),User("nseem",106) ]users.sort(key = lambda x: x.name)users.sort()print(users)# output : [aseem16, aseemprem56, nseem106, premaseem23, zseem36]# create new sorted listnewlist = sorted(users, key=lambda x: x.age, reverse=True)print(newlist)# output: [nseem106, aseemprem56, zseem36, premaseem23, aseem16]`

# Exit codes in Python

0 and 1 are the exit codes.

`exit(0)` means a clean exit without any errors / problems

`exit(1)` means there was some issue / error / problem and that is why the program is exiting.

This is not Python specific and is pretty common. A non-zero exit code is treated as an abnormal exit, and at times, the error code indicates what the problem was. A zero error code means a successful exit.

This is useful for other programs, shell, caller etc. to know what happened with your program and proceed accordingly.

For the record, you can use POSIX standard exit codes defined here.

Example:

```import sys, os

try:
config()
except:
sys.exit(os.EX_CONFIG)
try:
do_stuff()
except:
sys.exit(os.EX_SOFTWARE)
sys.exit(os.EX_OK) # code 0, all ok
```

# Python: Quick script to create directory

Here is simple python code to smartly create a folder if it does not exisit

```import os

def createFolder(directory):
try:
if not os.path.exists(directory):
os.makedirs(directory)
except OSError:
print ('Error: Creating directory. ' +  directory)

# Example
createFolder('./data/')
# Creates a folder in the current directory called data```

# Python: printing on the same line (progress indicator)

In Java we have print which allow to print in same line
and println allow us to print on new line

But in python print always prints on new line, that makes it to difficult to print progress.

`sys.stdout.write`Â will print without return carriage

``````import sys
sys.stdout.write("progressing xxx")

Code running which needs to show progress
sys.stdout.write(".")``````

# Python: Check if all elements in a list are equal

```# Pythonic ways of checking if all
# items in a list are equal:

>>> lst = ['a', 'a', 'a']

>>> len(set(lst)) == 1
True

>>> all(x == lst[0] for x in lst)
True

>>> lst.count(lst[0]) == len(lst)
True

# I ordered those from "most Pythonic" to "least Pythonic"
# and  "least efficient" to "most efficient".
# The len(set()) solution is idiomatic,  but constructing
# a set is less efficient memory and speed-wise.```

# Python: list comprehensions

```# Python's list comprehensions are awesome.

vals = [expression
for value in collection
if condition]

# This is equivalent to:

vals = []
for value in collection:
if condition:
vals.append(expression)

# Example:

>>> even_squares = [x * x for x in range(10) if not x % 2]
>>> even_squares
[0, 4, 16, 36, 64]```

# Python: Dict get with default value to void key not found error

```# The get() method on dicts
# and its "default" argument

name_for_userid = {
382: "Aseem",
590: "Bob",
951: "Dilbert",
}

def greeting(userid):
return "Hi %s!" % name_for_userid.get(userid, "there")

>>> greeting(382)
"Hi Aseem!"

>>> greeting(333333)
"Hi there!"```