From 7024086842c7bbfb7b76df129e1a44ab78e0568a Mon Sep 17 00:00:00 2001 From: dhavalsays <60363945+dhavalsays@users.noreply.github.com> Date: Mon, 18 Jan 2021 17:12:35 -0500 Subject: [PATCH 01/39] Update data_science_roadmap_2020.md --- TechTopics/DataScienceRoadMap2020/data_science_roadmap_2020.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TechTopics/DataScienceRoadMap2020/data_science_roadmap_2020.md b/TechTopics/DataScienceRoadMap2020/data_science_roadmap_2020.md index dcd99561..005c1f4d 100644 --- a/TechTopics/DataScienceRoadMap2020/data_science_roadmap_2020.md +++ b/TechTopics/DataScienceRoadMap2020/data_science_roadmap_2020.md @@ -21,6 +21,7 @@ Following is a schedule to learn data science step by step considering **4 hours * Python - Codebasics python tutorials (first 16) - https://www.youtube.com/playlist?list=PLeo1K3hjS3uv5U-Lmlnucd7gqF-3ehIh0 + - Codebasics python HINDI tutorials (first 16)- https://www.youtube.com/playlist?list=PLPbgcxheSpE1DJKfdko58_AIZRIT0TjpO - Make sure to work on exercises * R - Marin's lectures: https://www.youtube.com/playlist?list=PLqzoL9-eJTNBlVXxWvJkq0dtVut2sICUW From d8439249d7117ef43203806598e111b68d375691 Mon Sep 17 00:00:00 2001 From: dhavalsays <60363945+dhavalsays@users.noreply.github.com> Date: Mon, 18 Jan 2021 17:28:33 -0500 Subject: [PATCH 02/39] Update data_science_roadmap_2020.md --- TechTopics/DataScienceRoadMap2020/data_science_roadmap_2020.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TechTopics/DataScienceRoadMap2020/data_science_roadmap_2020.md b/TechTopics/DataScienceRoadMap2020/data_science_roadmap_2020.md index 005c1f4d..6bf573d0 100644 --- a/TechTopics/DataScienceRoadMap2020/data_science_roadmap_2020.md +++ b/TechTopics/DataScienceRoadMap2020/data_science_roadmap_2020.md @@ -45,6 +45,7 @@ Following is a schedule to learn data science step by step considering **4 hours * Machine learning - codebasics ml playlist (first 16): https://www.youtube.com/playlist?list=PLeo1K3hjS3uvCeTYTeyfe0-rN5r8zn9rw - data science regression project: same playlist as above. Tutorial 18 to 25 + - HINDI codebasics ml playlist (first 14): https://www.youtube.com/playlist?list=PLPbgcxheSpE0aBsefANDYe2X_-tyJbBMr ### Week 13, 14, 15, 16: Deep Learning From 5bb002bab68761e228776870ba5cb1afb857992c Mon Sep 17 00:00:00 2001 From: dhavalsays <60363945+dhavalsays@users.noreply.github.com> Date: Mon, 18 Jan 2021 17:48:40 -0500 Subject: [PATCH 03/39] Update data_science_roadmap_2020.md --- TechTopics/DataScienceRoadMap2020/data_science_roadmap_2020.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/TechTopics/DataScienceRoadMap2020/data_science_roadmap_2020.md b/TechTopics/DataScienceRoadMap2020/data_science_roadmap_2020.md index 6bf573d0..f517e4f7 100644 --- a/TechTopics/DataScienceRoadMap2020/data_science_roadmap_2020.md +++ b/TechTopics/DataScienceRoadMap2020/data_science_roadmap_2020.md @@ -64,9 +64,10 @@ Following is a schedule to learn data science step by step considering **4 hours ### Week 21, 22, 23, 24: BI tools * Tableau + - Codebasics sales insights project: https://www.youtube.com/playlist?list=PLeo1K3hjS3usDI9XeUgjNZs6VnE0meBrL + - HINDI codebasics sales insights project: https://www.youtube.com/playlist?list=PLPbgcxheSpE2B7YFfOualUTlRhgnQR7Kn - Abhishek Agarwal: https://www.youtube.com/playlist?list=PL6_D9USWkG1C4raCOTlTf_oq4XnNNNtm9 - Bharti consultancy: https://www.youtube.com/playlist?list=PLyD1XCIRA3gQmN73dHwQWr4R08ABZFMtZ - * Power BI (project) - codebasics sales insights project: https://www.youtube.com/playlist?list=PLeo1K3hjS3uva8pk1FI3iK9kCOKQdz1I9 From 2123111bc95a7457e3341527009938e102ec95c8 Mon Sep 17 00:00:00 2001 From: dhavalsays <60363945+dhavalsays@users.noreply.github.com> Date: Mon, 18 Jan 2021 18:19:43 -0500 Subject: [PATCH 04/39] Update data_analyst_learning_path_2020.md --- .../DataAnalystRoadMap2020/data_analyst_learning_path_2020.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/TechTopics/DataAnalystRoadMap2020/data_analyst_learning_path_2020.md b/TechTopics/DataAnalystRoadMap2020/data_analyst_learning_path_2020.md index 373f4ca7..d0735c4c 100644 --- a/TechTopics/DataAnalystRoadMap2020/data_analyst_learning_path_2020.md +++ b/TechTopics/DataAnalystRoadMap2020/data_analyst_learning_path_2020.md @@ -20,6 +20,8 @@ Following is a schedule to learn data science step by step considering **4 hours ### Week 3, 4, 5: BI tools * Tableau + - Codebasics sales insights project: https://www.youtube.com/playlist?list=PLeo1K3hjS3usDI9XeUgjNZs6VnE0meBrL + - HINDI codebasics sales insights project: https://www.youtube.com/playlist?list=PLPbgcxheSpE2B7YFfOualUTlRhgnQR7Kn - Abhishek Agarwal: https://www.youtube.com/playlist?list=PL6_D9USWkG1C4raCOTlTf_oq4XnNNNtm9 - Bharti consultancy: https://www.youtube.com/playlist?list=PLyD1XCIRA3gQmN73dHwQWr4R08ABZFMtZ From f2a8f36c527bd6e7e002f2cc1fd30d2e1b8bb48e Mon Sep 17 00:00:00 2001 From: d_p_beladiya Date: Thu, 21 Jan 2021 00:59:42 +0530 Subject: [PATCH 05/39] Added : exercises for 16 to 26 --- .../16_class_and_objects.py | 20 +++++++++++++ .../16_class_and_onject_exercise.md | 26 ++++++++++++++++ .../17_inheritance/inheritace.py | 15 ++++++++++ .../17_inheritance/inheritance.md | 24 +++++++++++++++ .../multiple_inheritance.md | 18 +++++++++++ .../multiple_inheritance.py | 20 +++++++++++++ .../19_raise_exception_finally.md | 27 +++++++++++++++++ .../19_raise_exception_finally.py | 14 +++++++++ .../20_Iterators/20_Iterators.md | 14 +++++++++ .../20_Iterators/20_Iterators.py | 30 +++++++++++++++++++ .../21_genrators/21_genrators.md | 16 ++++++++++ .../21_genrators/21_genrators.py | 9 ++++++ .../22_list_set_dict_comprehension.md | 24 +++++++++++++++ .../22_list_set_dict_comprehension.py | 6 ++++ .../23_sets_frozensets/23_sets_frozensets.md | 20 +++++++++++++ .../23_sets_frozensets/23_sets_frozensets.py | 13 ++++++++ .../python_basics/24_argparse/24_argparse.md | 21 +++++++++++++ .../python_basics/24_argparse/24_argparse.py | 20 +++++++++++++ .../25_decorators/25_decorators.md | 22 ++++++++++++++ .../25_decorators/25_decorators.py | 19 ++++++++++++ .../26_multithreading/26_multithreading.md | 16 ++++++++++ .../26_multithreading/26_multithreading.py | 14 +++++++++ 22 files changed, 408 insertions(+) create mode 100644 Basics/python_basics/16_class_and_objects/16_class_and_objects.py create mode 100644 Basics/python_basics/16_class_and_objects/16_class_and_onject_exercise.md create mode 100644 Basics/python_basics/17_inheritance/inheritace.py create mode 100644 Basics/python_basics/17_inheritance/inheritance.md create mode 100644 Basics/python_basics/18_multiple_inheritance/multiple_inheritance.md create mode 100644 Basics/python_basics/18_multiple_inheritance/multiple_inheritance.py create mode 100644 Basics/python_basics/19_raise_exception_finally/19_raise_exception_finally.md create mode 100644 Basics/python_basics/19_raise_exception_finally/19_raise_exception_finally.py create mode 100644 Basics/python_basics/20_Iterators/20_Iterators.md create mode 100644 Basics/python_basics/20_Iterators/20_Iterators.py create mode 100644 Basics/python_basics/21_genrators/21_genrators.md create mode 100644 Basics/python_basics/21_genrators/21_genrators.py create mode 100644 Basics/python_basics/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md create mode 100644 Basics/python_basics/22_list_set_dict_comprehension/22_list_set_dict_comprehension.py create mode 100644 Basics/python_basics/23_sets_frozensets/23_sets_frozensets.md create mode 100644 Basics/python_basics/23_sets_frozensets/23_sets_frozensets.py create mode 100644 Basics/python_basics/24_argparse/24_argparse.md create mode 100644 Basics/python_basics/24_argparse/24_argparse.py create mode 100644 Basics/python_basics/25_decorators/25_decorators.md create mode 100644 Basics/python_basics/25_decorators/25_decorators.py create mode 100644 Basics/python_basics/26_multithreading/26_multithreading.md create mode 100644 Basics/python_basics/26_multithreading/26_multithreading.py diff --git a/Basics/python_basics/16_class_and_objects/16_class_and_objects.py b/Basics/python_basics/16_class_and_objects/16_class_and_objects.py new file mode 100644 index 00000000..7c1120fa --- /dev/null +++ b/Basics/python_basics/16_class_and_objects/16_class_and_objects.py @@ -0,0 +1,20 @@ +class Employee: + + def __init__(self,id,name): + self.id=id + self.name=name + + def display(self): + print("ID: %d \nName: %s" % (self.id, self.name)) + +# Creating a emp instance of Employee class +emp = Employee(1,"coder") + +# Deleting the property of object +# del emp.id +# Deleting the object itself +emp.display() + + +#del emp +#emp.display() #it will gives error after del emp \ No newline at end of file diff --git a/Basics/python_basics/16_class_and_objects/16_class_and_onject_exercise.md b/Basics/python_basics/16_class_and_objects/16_class_and_onject_exercise.md new file mode 100644 index 00000000..52d5d054 --- /dev/null +++ b/Basics/python_basics/16_class_and_objects/16_class_and_onject_exercise.md @@ -0,0 +1,26 @@ +## Exercise: Class and Objects + +1. Create a sample class named Employee with two attributes id and name + + +``` +employee : + id + name + +-> such that object initializes id and name dynamically for every employees +``` + +2. Use del property on attributes as well as class objects + +``` +emp = Employee(1,"coder") + +use : del emp.id +use : del emp +``` + +[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/16_class_and_objects/16_class_and_objects.py) + + + diff --git a/Basics/python_basics/17_inheritance/inheritace.py b/Basics/python_basics/17_inheritance/inheritace.py new file mode 100644 index 00000000..6eece8db --- /dev/null +++ b/Basics/python_basics/17_inheritance/inheritace.py @@ -0,0 +1,15 @@ +class Father: + def __init__(self, name, lastname): + self.name = name + self.lastname = lastname + + def printname(self): + print(self.name, self.lastname) + +class Son(Father): + def __init__(self, name, lastname): + super().__init__(name, lastname) + +x = Son("Darshan", "Beladiya") +x.printname() + diff --git a/Basics/python_basics/17_inheritance/inheritance.md b/Basics/python_basics/17_inheritance/inheritance.md new file mode 100644 index 00000000..79505d97 --- /dev/null +++ b/Basics/python_basics/17_inheritance/inheritance.md @@ -0,0 +1,24 @@ +## Exercise: Inheritance + +1. create inheritance using father son relation on printname. + + +``` +for example, + father and son both has name so create a method for printname by passing firstname and lastname +``` + +2. use super() constructor for calling parent constructor. + +``` +class father: + #code + +class son(father): + super()-it refers father class,now you can call father's methods. +``` + +[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/17_inheritance/17_inheritance.py) + + + diff --git a/Basics/python_basics/18_multiple_inheritance/multiple_inheritance.md b/Basics/python_basics/18_multiple_inheritance/multiple_inheritance.md new file mode 100644 index 00000000..b2db45c1 --- /dev/null +++ b/Basics/python_basics/18_multiple_inheritance/multiple_inheritance.md @@ -0,0 +1,18 @@ +## Exercise: Multiple Inheritance + +Real Life Example : +1. Create multiple inheritance in mario game + + +``` +Q. if we have created Mario Game with only move module and now we wants to add jump as well as eat then what??? + +Ans : just make subclass from mario and add extra methods so that we will be having expanded class. +``` + + + +[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/18_multiple_inheritance/18_multiple_inheritance.py) + + + diff --git a/Basics/python_basics/18_multiple_inheritance/multiple_inheritance.py b/Basics/python_basics/18_multiple_inheritance/multiple_inheritance.py new file mode 100644 index 00000000..5e16308c --- /dev/null +++ b/Basics/python_basics/18_multiple_inheritance/multiple_inheritance.py @@ -0,0 +1,20 @@ +class superMario(): + def move(self): + print('I am moving') + + +class jump(): + def jump_above(self): + print('I just jumped') + +class mushroom(): + def eat_mushroom(self): + print('I have become big now') + + +class Mario(superMario, mushroom, jump): + pass +play = Mario() +play.move() +play.eat_mushroom() +play.jump_above() \ No newline at end of file diff --git a/Basics/python_basics/19_raise_exception_finally/19_raise_exception_finally.md b/Basics/python_basics/19_raise_exception_finally/19_raise_exception_finally.md new file mode 100644 index 00000000..78a4908d --- /dev/null +++ b/Basics/python_basics/19_raise_exception_finally/19_raise_exception_finally.md @@ -0,0 +1,27 @@ +## Exercise: Raise Exception And Finally + +1. Create Any Custom Exception and raise it. + +``` + for creating custom exception just create a subClass of Exception. +``` + +2.now raise that custom Exception + +``` +let us say, + +if age>18 + he is major +else + raise exception + +create cusomException named ismajor and raise it if age<18. +``` + + + +[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/19_raise_exception_finally/19_raise_exception_finally.py) + + + diff --git a/Basics/python_basics/19_raise_exception_finally/19_raise_exception_finally.py b/Basics/python_basics/19_raise_exception_finally/19_raise_exception_finally.py new file mode 100644 index 00000000..f1b8507c --- /dev/null +++ b/Basics/python_basics/19_raise_exception_finally/19_raise_exception_finally.py @@ -0,0 +1,14 @@ +# for making exception just make subclass of Exception +class isMajor(Exception): + pass + +def check(age): + if int(age) < 18: + raise isMajor + else: + print('Age: '+str(age)) + +#don't raise +check(23) +#raises an Exception +check(17) \ No newline at end of file diff --git a/Basics/python_basics/20_Iterators/20_Iterators.md b/Basics/python_basics/20_Iterators/20_Iterators.md new file mode 100644 index 00000000..2bf2bab0 --- /dev/null +++ b/Basics/python_basics/20_Iterators/20_Iterators.md @@ -0,0 +1,14 @@ +## Exercise: Iterators + +1. create iterator for fibonacci series. + + +``` +Explanation : + iterator must be initialized such that each of next returns next fibonacci number + +``` + + + +[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/20_Iterators/20_Iterators.py) diff --git a/Basics/python_basics/20_Iterators/20_Iterators.py b/Basics/python_basics/20_Iterators/20_Iterators.py new file mode 100644 index 00000000..4a2f21ba --- /dev/null +++ b/Basics/python_basics/20_Iterators/20_Iterators.py @@ -0,0 +1,30 @@ +class fibonacci: + def __init__(self): + # default constructor + self.previous = 0 + self.current = 1 + self.n = 1 + + def __iter__(self): + return self + + def __next__(self): + if self.n < 5: + result = self.previous + self.current + self.previous = self.current + self.current = result + self.n += 1 + return result + else: + raise StopIteration + +# init the fib_iterator +fib_iterator = iter(fibonacci()) +while True: + # print the value of next fibonaccinacci up to 5th fibonaccinacci + try: + print(next(fib_iterator)) + except StopIteration: + break + + diff --git a/Basics/python_basics/21_genrators/21_genrators.md b/Basics/python_basics/21_genrators/21_genrators.md new file mode 100644 index 00000000..471441eb --- /dev/null +++ b/Basics/python_basics/21_genrators/21_genrators.md @@ -0,0 +1,16 @@ +## Exercise: Generators + +1. Print Square Sequence using yield + + +``` + Create Generator method such that every time it will returns a next square number + +for exmaple : 1 4 9 16 .. + + +``` + + + +[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/21_genrators/21_genrators.py) diff --git a/Basics/python_basics/21_genrators/21_genrators.py b/Basics/python_basics/21_genrators/21_genrators.py new file mode 100644 index 00000000..3fb02201 --- /dev/null +++ b/Basics/python_basics/21_genrators/21_genrators.py @@ -0,0 +1,9 @@ +def next_square(): + i=1 + while True: + yield i*i + i+=1 +for n in next_square(): + if n>25: + break + print(n) \ No newline at end of file diff --git a/Basics/python_basics/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md b/Basics/python_basics/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md new file mode 100644 index 00000000..c82fd48f --- /dev/null +++ b/Basics/python_basics/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md @@ -0,0 +1,24 @@ +## Exercise: Generators + + +1. list1=create a list of integers + list2=create a list of strings of binary values of list1 + +``` + example : + num=[0,1,2,3,4] + binary=["0","1","10","11","100"] +``` + +2. Create a Dictionary of Binary values mapping with integers using Zip + + +``` + example : + dict={0:"0",1:"1",2:"10" ......} + +``` + + + +[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/22_list_set_dict_comprehension/22_list_set_dict_comprehension.py) diff --git a/Basics/python_basics/22_list_set_dict_comprehension/22_list_set_dict_comprehension.py b/Basics/python_basics/22_list_set_dict_comprehension/22_list_set_dict_comprehension.py new file mode 100644 index 00000000..718d7e7e --- /dev/null +++ b/Basics/python_basics/22_list_set_dict_comprehension/22_list_set_dict_comprehension.py @@ -0,0 +1,6 @@ +num=[0,1,2,3,4] +binary=["0","1","10","11","100"] + +z=zip(num,binary) +ans={num:binary for num,binary in z} +print(ans) \ No newline at end of file diff --git a/Basics/python_basics/23_sets_frozensets/23_sets_frozensets.md b/Basics/python_basics/23_sets_frozensets/23_sets_frozensets.md new file mode 100644 index 00000000..b711c4d9 --- /dev/null +++ b/Basics/python_basics/23_sets_frozensets/23_sets_frozensets.md @@ -0,0 +1,20 @@ +## Exercise: Sets and Frozen Sets + + +1. create any set anf try to use frozenset(setname) + + +2. Find the elements in a given set that are not in another set + + +``` + set1 = {1,2,3,4,5} + set2 = {4,5,6,7,8} + + diffrence between set1 and set2 is {1,2,3} + +``` + + + +[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/23_sets_frozensets/23_sets_frozensets.py) diff --git a/Basics/python_basics/23_sets_frozensets/23_sets_frozensets.py b/Basics/python_basics/23_sets_frozensets/23_sets_frozensets.py new file mode 100644 index 00000000..e3dd51b1 --- /dev/null +++ b/Basics/python_basics/23_sets_frozensets/23_sets_frozensets.py @@ -0,0 +1,13 @@ +set1 = {1,2,3,4,5} +set2 = {4,5,6,7,8} +print("Original sets:") +print(set1) +print(set2) +print("Difference of set1 and set2 using difference():") +print(set1.difference(set2)) +print("Difference of set2 and set1 using difference():") +print(set2.difference(set1)) +print("Difference of set1 and set2 using - operator:") +print(set1-set2) +print("Difference of set2 and set1 using - operator:") +print(set2-set1) \ No newline at end of file diff --git a/Basics/python_basics/24_argparse/24_argparse.md b/Basics/python_basics/24_argparse/24_argparse.md new file mode 100644 index 00000000..9fed9a12 --- /dev/null +++ b/Basics/python_basics/24_argparse/24_argparse.md @@ -0,0 +1,21 @@ +## Exercise: Commandline Argument Processing using argparse + +1. Take subject marks as command line arguments + +``` +example: + python3 cmd.py --physics 60 --chemistry 70 --maths 90 +``` + +2. find PCM(physics chemistry maths) Merit(Average) using command line input of marks + +``` + -take input + -do sum of marks + -take average + +``` + + + +[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/24_argparse/24_argparse.py) diff --git a/Basics/python_basics/24_argparse/24_argparse.py b/Basics/python_basics/24_argparse/24_argparse.py new file mode 100644 index 00000000..fe0c2d92 --- /dev/null +++ b/Basics/python_basics/24_argparse/24_argparse.py @@ -0,0 +1,20 @@ +import argparse + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--physics", help="physics marks") + parser.add_argument("--chemistry", help="chemistry marks") + parser.add_argument("--maths", help="maths marks") + + args = parser.parse_args() + + print(args.physics) + print(args.chemistry) + print(args.maths) + + + + print("Result:",(int(args.physics)+int(args.chemistry)+int(args.maths))/3) + + + #python3 cmd.py --physics 60 --chemistry 70 --maths 90 diff --git a/Basics/python_basics/25_decorators/25_decorators.md b/Basics/python_basics/25_decorators/25_decorators.md new file mode 100644 index 00000000..37bb35fe --- /dev/null +++ b/Basics/python_basics/25_decorators/25_decorators.md @@ -0,0 +1,22 @@ +## Exercise: Decorators + +1. Create decorator function to check that the argument passed to the function factorial is a positive integer: + +``` +example: + + factorial(-1) : raise Exception or print error message + + +``` + + +2. Also check that number is integer or not +``` +example: + + factorial(1.354) : raise Exception or print error message + + +``` +[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basicsHindi/25_decorators/25_decorators.py) diff --git a/Basics/python_basics/25_decorators/25_decorators.py b/Basics/python_basics/25_decorators/25_decorators.py new file mode 100644 index 00000000..f0482093 --- /dev/null +++ b/Basics/python_basics/25_decorators/25_decorators.py @@ -0,0 +1,19 @@ +def check(f): + def helper(x): + if type(x) == int and x > 0: + return f(x) + else: + raise Exception("Argument is not an integer") + return helper + +@check +def factorial(n): + if n == 1: + return 1 + else: + return n * factorial(n-1) + +for i in range(1,10): + print(i, factorial(i)) + +print(factorial(-1)) \ No newline at end of file diff --git a/Basics/python_basics/26_multithreading/26_multithreading.md b/Basics/python_basics/26_multithreading/26_multithreading.md new file mode 100644 index 00000000..0777e663 --- /dev/null +++ b/Basics/python_basics/26_multithreading/26_multithreading.md @@ -0,0 +1,16 @@ +## Exercise: Multithreading + +1. Create any multithreaded code using for loop for creating multithreads + +``` +for i in range(10): + th = Thread(target=func_name, args=(i, )) + +``` + + +2. print total active threads in multithreaded code using threading.active_count() + + + +[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/26_multithreading/26_multithreading.py) diff --git a/Basics/python_basics/26_multithreading/26_multithreading.py b/Basics/python_basics/26_multithreading/26_multithreading.py new file mode 100644 index 00000000..601a4e3e --- /dev/null +++ b/Basics/python_basics/26_multithreading/26_multithreading.py @@ -0,0 +1,14 @@ +import time +import threading +from threading import Thread + +def sleepMe(i): + print("Thread %i will sleep." % i) + time.sleep(5) + print("Thread %i is awake" % i) + +for i in range(10): + th = Thread(target=sleepMe, args=(i, )) + th.start() + print("Current Threads: %i." % threading.active_count()) + From 75596dd0341484fd7fd329effd616514a71b380c Mon Sep 17 00:00:00 2001 From: Karandeep Singh Grover <30365139+groverkds@users.noreply.github.com> Date: Mon, 25 Jan 2021 14:18:38 +0530 Subject: [PATCH 06/39] Rename 16_class_and_onject_exercise.md to 16_class_and_object_exercise.md --- ...ass_and_onject_exercise.md => 16_class_and_object_exercise.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Basics/python_basics/16_class_and_objects/{16_class_and_onject_exercise.md => 16_class_and_object_exercise.md} (100%) diff --git a/Basics/python_basics/16_class_and_objects/16_class_and_onject_exercise.md b/Basics/python_basics/16_class_and_objects/16_class_and_object_exercise.md similarity index 100% rename from Basics/python_basics/16_class_and_objects/16_class_and_onject_exercise.md rename to Basics/python_basics/16_class_and_objects/16_class_and_object_exercise.md From 63cdf22b1dc4a3b3717af0e51938ce2c1075ea65 Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 25 Jan 2021 15:48:41 +0530 Subject: [PATCH 07/39] ENH: moved the algo and DS to another repo --- Algorithms/1_BinarySearch/__init__.py | 0 .../1_BinarySearch/binary_search_exercise.md | 14 - .../binary_search_exercise_solution.py | 62 -- Algorithms/1_BinarySearch/binarysearch.py | 55 -- Algorithms/1_BinarySearch/util.py | 9 - Algorithms/2_BubbleSort/bubble_sort.py | 25 - .../2_BubbleSort/bubble_sort_exercise.md | 40 -- .../bubble_sort_exercise_solution.py | 28 - Algorithms/3_QuickSort/quick_sort.py | 53 -- Algorithms/3_QuickSort/quick_sort_exercise.md | 8 - .../quick_sort_exercise_soluiton_lomuto.py | 44 -- Algorithms/4_InsertionSort/insertion_sort.py | 0 DataStructures/10_Graph/graph.py | 84 --- DataStructures/2_Arrays/2_arrays_exercise.md | 45 -- .../2_Arrays/Solution/1_expenses.py | 37 - DataStructures/2_Arrays/Solution/2_marvel.py | 23 - .../2_Arrays/Solution/3_odd_even_numbers.py | 9 - DataStructures/3_LinkedList/3_linked_list.py | 99 --- .../3_LinkedList/3_linked_list_exercise.md | 50 -- .../Solution/doubly_linked_list_exercise.py | 131 ---- .../Solution/singly_linked_list_exercise.py | 140 ---- DataStructures/4_HashTable/4_HashTable.ipynb | 566 --------------- DataStructures/4_HashTable/stock_prices.csv | 6 - .../4_hash_table_collision_handling.ipynb | 338 --------- .../4_hash_table_exercise.md | 31 - .../exercise_hash_table_linear_probing.ipynb | 428 ----------- .../exercise_poem_find_word_occurances.ipynb | 226 ------ .../Solution/nyc_weather.csv | 11 - .../Solution/poem.txt | 23 - .../Solution/weather_analysis.ipynb | 310 -------- DataStructures/5_Stack/5_stack.ipynb | 669 ------------------ DataStructures/5_Stack/5_stack_exercise.md | 18 - .../5_Stack/Exercise/balance_paran.py | 51 -- .../5_Stack/Exercise/reverse_string.py | 37 - DataStructures/5_Stack/dynamic_memory.png | Bin 23569 -> 0 bytes DataStructures/6_Queue/6_queue.ipynb | 441 ------------ DataStructures/6_Queue/6_queue_exercise.md | 38 - .../6_Queue/Exercise/binary_numbers.py | 40 -- .../6_Queue/Exercise/food_ordering_system.py | 48 -- DataStructures/7_Tree/7_tree.py | 52 -- DataStructures/7_Tree/7_tree_exercise.md | 34 - .../7_Tree/Exercise/location_hierarchy.py | 70 -- .../7_Tree/Exercise/management_hierarchy.py | 63 -- DataStructures/7_Tree/all_trees.png | Bin 36146 -> 0 bytes DataStructures/7_Tree/location_trees.png | Bin 25100 -> 0 bytes DataStructures/7_Tree/location_trees_all.png | Bin 46326 -> 0 bytes DataStructures/7_Tree/management_both.PNG | Bin 23277 -> 0 bytes .../8_binary_tree_part_1_exercise.md | 12 - .../Exercise/binary_tree_part_1_exercise.py | 106 --- .../8_Binary_Tree_1/binary_tree_part_1.py | 69 -- .../9_binary_tree_part_2_exercise.md | 28 - .../Exercise/binary_tree_part_2_exercise.py | 103 --- .../9_Binary_Tree_2/binary_tree_part_2.py | 103 --- data-structures-algorithms-python | 1 - 54 files changed, 4878 deletions(-) delete mode 100644 Algorithms/1_BinarySearch/__init__.py delete mode 100644 Algorithms/1_BinarySearch/binary_search_exercise.md delete mode 100644 Algorithms/1_BinarySearch/binary_search_exercise_solution.py delete mode 100644 Algorithms/1_BinarySearch/binarysearch.py delete mode 100644 Algorithms/1_BinarySearch/util.py delete mode 100644 Algorithms/2_BubbleSort/bubble_sort.py delete mode 100644 Algorithms/2_BubbleSort/bubble_sort_exercise.md delete mode 100644 Algorithms/2_BubbleSort/bubble_sort_exercise_solution.py delete mode 100644 Algorithms/3_QuickSort/quick_sort.py delete mode 100644 Algorithms/3_QuickSort/quick_sort_exercise.md delete mode 100644 Algorithms/3_QuickSort/quick_sort_exercise_soluiton_lomuto.py delete mode 100644 Algorithms/4_InsertionSort/insertion_sort.py delete mode 100644 DataStructures/10_Graph/graph.py delete mode 100644 DataStructures/2_Arrays/2_arrays_exercise.md delete mode 100644 DataStructures/2_Arrays/Solution/1_expenses.py delete mode 100644 DataStructures/2_Arrays/Solution/2_marvel.py delete mode 100644 DataStructures/2_Arrays/Solution/3_odd_even_numbers.py delete mode 100644 DataStructures/3_LinkedList/3_linked_list.py delete mode 100644 DataStructures/3_LinkedList/3_linked_list_exercise.md delete mode 100644 DataStructures/3_LinkedList/Solution/doubly_linked_list_exercise.py delete mode 100644 DataStructures/3_LinkedList/Solution/singly_linked_list_exercise.py delete mode 100644 DataStructures/4_HashTable/4_HashTable.ipynb delete mode 100644 DataStructures/4_HashTable/stock_prices.csv delete mode 100644 DataStructures/4_HashTable_2_Collisions/4_hash_table_collision_handling.ipynb delete mode 100644 DataStructures/4_HashTable_2_Collisions/4_hash_table_exercise.md delete mode 100644 DataStructures/4_HashTable_2_Collisions/Solution/exercise_hash_table_linear_probing.ipynb delete mode 100644 DataStructures/4_HashTable_2_Collisions/Solution/exercise_poem_find_word_occurances.ipynb delete mode 100644 DataStructures/4_HashTable_2_Collisions/Solution/nyc_weather.csv delete mode 100644 DataStructures/4_HashTable_2_Collisions/Solution/poem.txt delete mode 100644 DataStructures/4_HashTable_2_Collisions/Solution/weather_analysis.ipynb delete mode 100644 DataStructures/5_Stack/5_stack.ipynb delete mode 100644 DataStructures/5_Stack/5_stack_exercise.md delete mode 100644 DataStructures/5_Stack/Exercise/balance_paran.py delete mode 100644 DataStructures/5_Stack/Exercise/reverse_string.py delete mode 100644 DataStructures/5_Stack/dynamic_memory.png delete mode 100644 DataStructures/6_Queue/6_queue.ipynb delete mode 100644 DataStructures/6_Queue/6_queue_exercise.md delete mode 100644 DataStructures/6_Queue/Exercise/binary_numbers.py delete mode 100644 DataStructures/6_Queue/Exercise/food_ordering_system.py delete mode 100644 DataStructures/7_Tree/7_tree.py delete mode 100644 DataStructures/7_Tree/7_tree_exercise.md delete mode 100644 DataStructures/7_Tree/Exercise/location_hierarchy.py delete mode 100644 DataStructures/7_Tree/Exercise/management_hierarchy.py delete mode 100644 DataStructures/7_Tree/all_trees.png delete mode 100644 DataStructures/7_Tree/location_trees.png delete mode 100644 DataStructures/7_Tree/location_trees_all.png delete mode 100644 DataStructures/7_Tree/management_both.PNG delete mode 100644 DataStructures/8_Binary_Tree_1/8_binary_tree_part_1_exercise.md delete mode 100644 DataStructures/8_Binary_Tree_1/Exercise/binary_tree_part_1_exercise.py delete mode 100644 DataStructures/8_Binary_Tree_1/binary_tree_part_1.py delete mode 100644 DataStructures/9_Binary_Tree_2/9_binary_tree_part_2_exercise.md delete mode 100644 DataStructures/9_Binary_Tree_2/Exercise/binary_tree_part_2_exercise.py delete mode 100644 DataStructures/9_Binary_Tree_2/binary_tree_part_2.py delete mode 160000 data-structures-algorithms-python diff --git a/Algorithms/1_BinarySearch/__init__.py b/Algorithms/1_BinarySearch/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/Algorithms/1_BinarySearch/binary_search_exercise.md b/Algorithms/1_BinarySearch/binary_search_exercise.md deleted file mode 100644 index fbec3873..00000000 --- a/Algorithms/1_BinarySearch/binary_search_exercise.md +++ /dev/null @@ -1,14 +0,0 @@ -### Binary Search Exercise -1. When I try to find number 5 in below list using binary search, it doesn't work and returns me -1 index. Why is that? - - ```numbers = [1,4,6,9,10,5,7]``` - -1. Find index of all the occurances of a number from sorted list - - ``` - numbers = [1,4,6,9,11,15,15,15,17,21,34,34,56] - number_to_find = 15 - ``` - This should return 5,6,7 as indices containing number 15 in the array - -[Solution](https://github.com/codebasics/py/blob/master/Algorithms/1_BinarySearch/binary_search_exercise_solution.py) \ No newline at end of file diff --git a/Algorithms/1_BinarySearch/binary_search_exercise_solution.py b/Algorithms/1_BinarySearch/binary_search_exercise_solution.py deleted file mode 100644 index cc0ae864..00000000 --- a/Algorithms/1_BinarySearch/binary_search_exercise_solution.py +++ /dev/null @@ -1,62 +0,0 @@ -############ BINARY SEARCH EXERCISE SOLUTION: CODEBASICS YOUTUBE CHANNEL #################### - -################### PROBLEM 1 ####################### -# When I try to find number 5 in below list using binary search, it doesn't work and returns me -1 index. Why is that? -# numbers = [1,4,6,9,10,5,7] -# Answer: It is because the list is not sorted! Binary search requires that list has to be sorted - -################### PROBLEM 2 ####################### -# Problem: Find index of all the occurances of a number from sorted list -# Solution here tries to find an index of a number using binary search. Now since the list is sorted, -# it can do left and right scan from the initial index to find all occurances of a given element -# This method is not most efficient and I want you to figure out even a better way of doing it. In -# any case below method is still effective - -def binary_search(numbers_list, number_to_find): - left_index = 0 - right_index = len(numbers_list) - 1 - mid_index = 0 - - while left_index <= right_index: - mid_index = (left_index + right_index) // 2 - mid_number = numbers_list[mid_index] - - if mid_number == number_to_find: - return mid_index - - if mid_number < number_to_find: # this means number is in right hand side of the list - left_index = mid_index + 1 - else: # number to find is on left hand side of the list - right_index = mid_index - 1 - - return -1 - -def find_all_occurances(numbers, number_to_find): - index = binary_search(numbers, number_to_find) - indices = [index] - # find indices on left hand side - i = index-1 - while i >=0: - if numbers[i] == number_to_find: - indices.append(i) - else: - break - i = i - 1 - - # find indices on right hand side - i = index + 1 - while i= len(numbers_list) or mid_index < 0: - return -1 - - mid_number = numbers_list[mid_index] - - if mid_number == number_to_find: - return mid_index - - if mid_number < number_to_find: - left_index = mid_index + 1 - else: - right_index = mid_index - 1 - - return binary_search_recursive(numbers_list, number_to_find, left_index, right_index) - -if __name__ == '__main__': - numbers_list = [12, 15, 17, 19, 21, 24, 45, 67] - number_to_find = 21 - - index = binary_search_recursive(numbers_list, number_to_find, 0, len(numbers_list)) - print(f"Number found at index {index} using binary search") \ No newline at end of file diff --git a/Algorithms/1_BinarySearch/util.py b/Algorithms/1_BinarySearch/util.py deleted file mode 100644 index 2a7d2d59..00000000 --- a/Algorithms/1_BinarySearch/util.py +++ /dev/null @@ -1,9 +0,0 @@ -import time -def time_it(func): - def wrapper(*args, **kwargs): - start = time.time() - result = func(*args,**kwargs) - end = time.time() - print(func.__name__ +" took " + str((end-start)*1000) + " mil sec") - return result - return wrapper \ No newline at end of file diff --git a/Algorithms/2_BubbleSort/bubble_sort.py b/Algorithms/2_BubbleSort/bubble_sort.py deleted file mode 100644 index c39aa873..00000000 --- a/Algorithms/2_BubbleSort/bubble_sort.py +++ /dev/null @@ -1,25 +0,0 @@ - -# you can use this to sort strings too -def bubble_sort(elements): - size = len(elements) - - for i in range(size-1): - swapped = False - for j in range(size-1-i): - if elements[j] > elements[j+1]: - tmp = elements[j] - elements[j] = elements[j+1] - elements[j+1] = tmp - swapped = True - - if not swapped: - break - - -if __name__ == '__main__': - elements = [5,9,2,1,67,34,88,34] - elements = [1,2,3,4,2] - elements = ["mona", "dhaval", "aamir", "tina", "chang"] - - bubble_sort(elements) - print(elements) \ No newline at end of file diff --git a/Algorithms/2_BubbleSort/bubble_sort_exercise.md b/Algorithms/2_BubbleSort/bubble_sort_exercise.md deleted file mode 100644 index b507c166..00000000 --- a/Algorithms/2_BubbleSort/bubble_sort_exercise.md +++ /dev/null @@ -1,40 +0,0 @@ -### Bubble Sort Exercise - -Modify [bubble_sort function](https://github.com/codebasics/py/blob/master/Algorithms/2_BubbleSort/bubble_sort.py) such that it can sort following list of transactions happening in an electronic store, -``` -elements = [ - { 'name': 'mona', 'transaction_amount': 1000, 'device': 'iphone-10'}, - { 'name': 'dhaval', 'transaction_amount': 400, 'device': 'google pixel'}, - { 'name': 'kathy', 'transaction_amount': 200, 'device': 'vivo'}, - { 'name': 'aamir', 'transaction_amount': 800, 'device': 'iphone-8'}, - ] -``` -bubble_sort function should take key from a transaction record and sort the list as per that key. For example, -``` -bubble_sort(elements, key='transaction_amount') -``` -This will sort elements by transaction_amount and your sorted list will look like, -``` -elements = [ - { 'name': 'kathy', 'transaction_amount': 200, 'device': 'vivo'}, - { 'name': 'dhaval', 'transaction_amount': 400, 'device': 'google pixel'}, - { 'name': 'aamir', 'transaction_amount': 800, 'device': 'iphone-8'}, - { 'name': 'mona', 'transaction_amount': 1000, 'device': 'iphone-10'}, - ] -``` -But if you call it like this, -``` -bubble_sort(elements, key='name') -``` -output will be, -``` -elements = [ - { 'name': 'aamir', 'transaction_amount': 800, 'device': 'iphone-8'}, - { 'name': 'dhaval', 'transaction_amount': 400, 'device': 'google pixel'}, - { 'name': 'kathy', 'transaction_amount': 200, 'device': 'vivo'}, - { 'name': 'mona', 'transaction_amount': 1000, 'device': 'iphone-10'}, - ] -``` - -[Solution](https://github.com/codebasics/py/blob/master/Algorithms/2_BubbleSort/bubble_sort_exercise_solution.py) - diff --git a/Algorithms/2_BubbleSort/bubble_sort_exercise_solution.py b/Algorithms/2_BubbleSort/bubble_sort_exercise_solution.py deleted file mode 100644 index df838f7c..00000000 --- a/Algorithms/2_BubbleSort/bubble_sort_exercise_solution.py +++ /dev/null @@ -1,28 +0,0 @@ -# you can use this to sort strings too -def bubble_sort(elements, key=None): - size = len(elements) - - for i in range(size-1): - swapped = False - for j in range(size-1-i): - a = elements[j][key] - b = elements[j+1][key] - if a > b: - tmp = elements[j] - elements[j] = elements[j+1] - elements[j+1] = tmp - swapped = True - - if not swapped: - break - -if __name__ == '__main__': - elements = [ - { 'name': 'mona', 'transaction_amount': 1000, 'device': 'iphone-10'}, - { 'name': 'dhaval', 'transaction_amount': 400, 'device': 'google pixel'}, - { 'name': 'kathy', 'transaction_amount': 200, 'device': 'vivo'}, - { 'name': 'aamir', 'transaction_amount': 800, 'device': 'iphone-8'}, - ] - - bubble_sort(elements, key='transaction_amount') - print(elements) \ No newline at end of file diff --git a/Algorithms/3_QuickSort/quick_sort.py b/Algorithms/3_QuickSort/quick_sort.py deleted file mode 100644 index 36b7e73a..00000000 --- a/Algorithms/3_QuickSort/quick_sort.py +++ /dev/null @@ -1,53 +0,0 @@ -# implementation of quick sort in python using hoare partition scheme - -def swap(a, b, arr): - if a!=b: - tmp = arr[a] - arr[a] = arr[b] - arr[b] = tmp - -def quick_sort(elements, start, end): - if start < end: - pi = partition(elements, start, end) - quick_sort(elements, start, pi-1) - quick_sort(elements, pi+1, end) - -def partition(elements, start, end): - pivot_index = start - pivot = elements[pivot_index] - - while start < end: - while start < len(elements) and elements[start] <= pivot: - start+=1 - - while elements[end] > pivot: - end-=1 - - if start < end: - swap(start, end, elements) - - swap(pivot_index, end, elements) - - return end - - -if __name__ == '__main__': - elements = [11,9,29,7,2,15,28] - # elements = ["mona", "dhaval", "aamir", "tina", "chang"] - quick_sort(elements, 0, len(elements)-1) - print(elements) - - tests = [ - [11,9,29,7,2,15,28], - [3, 7, 9, 11], - [25, 22, 21, 10], - [29, 15, 28], - [], - [6] - ] - - for elements in tests: - quick_sort(elements, 0, len(elements)-1) - print(f'sorted array: {elements}') - - diff --git a/Algorithms/3_QuickSort/quick_sort_exercise.md b/Algorithms/3_QuickSort/quick_sort_exercise.md deleted file mode 100644 index 82e7bfa2..00000000 --- a/Algorithms/3_QuickSort/quick_sort_exercise.md +++ /dev/null @@ -1,8 +0,0 @@ -### Exercise: Quick Sort -Implement quick sort using lumoto partition scheme. This partition scheme is explained in the video tutorial, you need to write python code to implement it. -Check the pseudo code here: https://en.wikipedia.org/wiki/Quicksort Check the section Lomuto partition scheme - - [Solution](https://github.com/codebasics/py/blob/master/Algorithms/3_QuickSort/quick_sort_exercise_soluiton_lomuto.py) - - - \ No newline at end of file diff --git a/Algorithms/3_QuickSort/quick_sort_exercise_soluiton_lomuto.py b/Algorithms/3_QuickSort/quick_sort_exercise_soluiton_lomuto.py deleted file mode 100644 index 7a20b523..00000000 --- a/Algorithms/3_QuickSort/quick_sort_exercise_soluiton_lomuto.py +++ /dev/null @@ -1,44 +0,0 @@ -# This implements quick sort using lomuto partition scheme - -def swap(a, b, arr): - if a!=b: - tmp = arr[a] - arr[a] = arr[b] - arr[b] = tmp - -def quick_sort(elements, start, end): - if len(elements)== 1: - return - if start < end: - pi = partition(elements, start, end) - quick_sort(elements, start, pi-1) - quick_sort(elements, pi+1, end) - -def partition(elements, start, end): - pivot = elements[end] - p_index = start - - for i in range(start, end): - if elements[i] <= pivot: - swap(i, p_index, elements) - p_index += 1 - - swap(p_index, end, elements) - - return p_index - - -if __name__ == '__main__': - tests = [ - [11,9,29,7,2,15,28], - [3, 7, 9, 11], - [25, 22, 21, 10], - [29, 15, 28], - [], - [6] - ] - # elements = ["mona", "dhaval", "aamir", "tina", "chang"] - - for elements in tests: - quick_sort(elements, 0, len(elements)-1) - print(f'sorted array: {elements}') diff --git a/Algorithms/4_InsertionSort/insertion_sort.py b/Algorithms/4_InsertionSort/insertion_sort.py deleted file mode 100644 index e69de29b..00000000 diff --git a/DataStructures/10_Graph/graph.py b/DataStructures/10_Graph/graph.py deleted file mode 100644 index cf973322..00000000 --- a/DataStructures/10_Graph/graph.py +++ /dev/null @@ -1,84 +0,0 @@ -class Graph: - def __init__(self, edges): - self.edges = edges - self.graph_dict = {} - for start, end in edges: - if start in self.graph_dict: - self.graph_dict[start].append(end) - else: - self.graph_dict[start] = [end] - print("Graph Dict:", self.graph_dict) - - def get_paths(self, start, end, path=[]): - path = path + [start] - - if start == end: - return [path] - - if start not in self.graph_dict: - return [] - - paths = [] - for node in self.graph_dict[start]: - if node not in path: - new_paths = self.get_paths(node, end, path) - for p in new_paths: - paths.append(p) - - return paths - - def get_shortest_path(self, start, end, path=[]): - path = path + [start] - - if start == end: - return path - - if start not in self.graph_dict: - return None - - shortest_path = None - for node in self.graph_dict[start]: - if node not in path: - sp = self.get_shortest_path(node, end, path) - if sp: - if shortest_path is None or len(sp) < len(shortest_path): - shortest_path = sp - - return shortest_path - -if __name__ == '__main__': - - routes = [ - ("Mumbai","Pune"), - ("Mumbai", "Surat"), - ("Surat", "Bangaluru"), - ("Pune","Hyderabad"), - ("Pune","Mysuru"), - ("Hyderabad","Bangaluru"), - ("Hyderabad", "Chennai"), - ("Mysuru", "Bangaluru"), - ("Chennai", "Bangaluru") - ] - - routes = [ - ("Mumbai", "Paris"), - ("Mumbai", "Dubai"), - ("Paris", "Dubai"), - ("Paris", "New York"), - ("Dubai", "New York"), - ("New York", "Toronto"), - ] - - route_graph = Graph(routes) - - start = "Mumbai" - end = "New York" - - print(f"All paths between: {start} and {end}: ",route_graph.get_paths(start,end)) - print(f"Shortest path between {start} and {end}: ", route_graph.get_shortest_path(start,end)) - - start = "Dubai" - end = "New York" - - print(f"All paths between: {start} and {end}: ",route_graph.get_paths(start,end)) - print(f"Shortest path between {start} and {end}: ", route_graph.get_shortest_path(start,end)) diff --git a/DataStructures/2_Arrays/2_arrays_exercise.md b/DataStructures/2_Arrays/2_arrays_exercise.md deleted file mode 100644 index 5713d352..00000000 --- a/DataStructures/2_Arrays/2_arrays_exercise.md +++ /dev/null @@ -1,45 +0,0 @@ -# Exercise: Array DataStructure - -1. Let us say your expense for every month are listed below, - 1. January - 2200 - 2. February - 2350 - 3. March - 2600 - 4. April - 2130 - 5. May - 2190 - -Create a list to store these monthly expenses and using that find out, - - 1. In Feb, how many dollars you spent extra compare to January? - 2. Find out your total expense in first quarter (first three months) of the year. - 3. Find out if you spent exactly 2000 dollars in any month - 4. June month just finished and your expense is 1980 dollar. Add this item to our monthly expense list - 5. You returned an item that you bought in a month of April and - got a refund of 200$. Make a correction to your monthly expense list - based on this - -[Solution](https://github.com/codebasics/py/blob/master/DataStructures/2_Arrays/Solution/1_expenses.py) - -2. You have a list of your favourite marvel super heros. -``` -heros=['spider man','thor','hulk','iron man','captain america'] -``` - -Using this find out, - - 1. Length of the list - 2. Add 'black panther' at the end of this list - 3. You realize that you need to add 'black panther' after 'hulk', - so remove it from the list first and then add it after 'hulk' - 4. Now you don't like thor and hulk because they get angry easily :) - So you want to remove thor and hulk from list and replace them with doctor strange (because he is cool). - Do that with one line of code. - 5. Sort the heros list in alphabetical order (Hint. Use dir() functions to list down all functions available in list) - -[Solution](https://github.com/codebasics/py/blob/master/DataStructures/2_Arrays/Solution/2_marvel.py) - - -3. Create a list of all odd numbers between 1 and a max number. -Max number is something you need to take from a user using input() function - -[Solution](https://github.com/codebasics/py/blob/master/DataStructures/2_Arrays/Solution/3_odd_even_numbers.py) - diff --git a/DataStructures/2_Arrays/Solution/1_expenses.py b/DataStructures/2_Arrays/Solution/1_expenses.py deleted file mode 100644 index 41bfc44d..00000000 --- a/DataStructures/2_Arrays/Solution/1_expenses.py +++ /dev/null @@ -1,37 +0,0 @@ -# 1. Let us say your expense for every month are listed below, -# 1. January - 2200 -# 2. February - 2350 -# 3. March - 2600 -# 4. April - 2130 -# 5. May - 2190 -# -# Create a list to store these monthly expenses and using that find out, -# -# 1. In Feb, how many dollars you spent extra compare to January? -# 2. Find out your total expense in first quarter (first three months) of the year. -# 3. Find out if you spent exactly 2000 dollars in any month -# 4. June month just finished and your expense is 1980 dollar. Add this item to our monthly expense list -# 5. You returned an item that you bought in a month of April and -# got a refund of 200$. Make a correction to your monthly expense list -# based on this - -exp = [2200,2350,2600,2130,2190] - -# 1. In Feb, how many dollars you spent extra compare to January? -print("In feb this much extra was spent compared to jan:",exp[1]-exp[0]) # 150 - -# 2. Find out your total expense in first quarter (first three months) of the year -print("Expense for first quarter:",exp[0]+exp[1]+exp[2]) # 7150 - -# 3. Find out if you spent exactly 2000 dollars in any month -print("Did I spent 2000$ in any month? ", 2000 in exp) # False - -# 4. June month just finished and your expense is 1980 dollar. Add this item to our monthly expense list -exp.append(1980) -print("Expenses at the end of June:",exp) # [2200, 2350, 2600, 2130, 2190, 1980] - -# 5. You returned an item that you bought in a month of April and -# got a refund of 200$. Make a correction to your monthly expense list -# based on this -exp[3] = exp[3] - 200 -print("Expenses after 200$ return in April:",exp) # [2200, 2350, 2600, 1930, 2190, 1980] diff --git a/DataStructures/2_Arrays/Solution/2_marvel.py b/DataStructures/2_Arrays/Solution/2_marvel.py deleted file mode 100644 index ef24f57f..00000000 --- a/DataStructures/2_Arrays/Solution/2_marvel.py +++ /dev/null @@ -1,23 +0,0 @@ -# 2. You have a list of your favourite marvel super heros -# heros=['spider man','thor','hulk','iron man','captain america'] -# Using this list - -heros=['spider man','thor','hulk','iron man','captain america'] -# 1. Length of the list -print(len(heros)) -# 2. Add 'black panther' at the end of this list -heros.append('black panther') -print(heros) -# 3. You realize that you need to add 'black panther' after 'hulk', -# so remove it from the list first and then add it after 'hulk' -heros.remove('black panther') -heros.insert(3,'black panther') -print(heros) -# 4. Now you don't like thor and hulk because they get angry easily :) -# So you want to remove thor and hulk from list and replace them with doctor strange (because he is cool). -# Do that with one line of code. -heros[1:3]=['doctor strange'] -print(heros) -# 5. Sort the list in alphabetical order -heros.sort() -print(heros) diff --git a/DataStructures/2_Arrays/Solution/3_odd_even_numbers.py b/DataStructures/2_Arrays/Solution/3_odd_even_numbers.py deleted file mode 100644 index 334b53cc..00000000 --- a/DataStructures/2_Arrays/Solution/3_odd_even_numbers.py +++ /dev/null @@ -1,9 +0,0 @@ -max = int(input("Enter max number: ")) - -odd_numbers = [] - -for i in range(max): - if i%2 == 1: - odd_numbers.append(i) - -print("Odd numbers: ",odd_numbers) diff --git a/DataStructures/3_LinkedList/3_linked_list.py b/DataStructures/3_LinkedList/3_linked_list.py deleted file mode 100644 index a6d94660..00000000 --- a/DataStructures/3_LinkedList/3_linked_list.py +++ /dev/null @@ -1,99 +0,0 @@ -class Node: - def __init__(self, data=None, next=None): - self.data = data - self.next = next - -class LinkedList: - def __init__(self): - self.head = None - - def print(self): - if self.head is None: - print("Linked list is empty") - return - itr = self.head - llstr = '' - while itr: - llstr += str(itr.data)+' --> ' if itr.next else str(itr.data) - itr = itr.next - print(llstr) - - def get_length(self): - count = 0 - itr = self.head - while itr: - count+=1 - itr = itr.next - - return count - - def insert_at_begining(self, data): - node = Node(data, self.head) - self.head = node - - def insert_at_end(self, data): - if self.head is None: - self.head = Node(data, None) - return - - itr = self.head - - while itr.next: - itr = itr.next - - itr.next = Node(data, None) - - def insert_at(self, index, data): - if index<0 or index>self.get_length(): - raise Exception("Invalid Index") - - if index==0: - self.insert_at_begining(data) - return - - count = 0 - itr = self.head - while itr: - if count == index - 1: - node = Node(data, itr.next) - itr.next = node - break - - itr = itr.next - count += 1 - - def remove_at(self, index): - if index<0 or index>=self.get_length(): - raise Exception("Invalid Index") - - if index==0: - self.head = self.head.next - return - - count = 0 - itr = self.head - while itr: - if count == index - 1: - itr.next = itr.next.next - break - - itr = itr.next - count+=1 - - def insert_values(self, data_list): - self.head = None - for data in data_list: - self.insert_at_end(data) - - -if __name__ == '__main__': - ll = LinkedList() - ll.insert_values(["banana","mango","grapes","orange"]) - ll.insert_at(1,"blueberry") - ll.remove_at(2) - ll.print() - - ll.insert_values([45,7,12,567,99]) - ll.insert_at_end(67) - ll.print() - diff --git a/DataStructures/3_LinkedList/3_linked_list_exercise.md b/DataStructures/3_LinkedList/3_linked_list_exercise.md deleted file mode 100644 index e1245e80..00000000 --- a/DataStructures/3_LinkedList/3_linked_list_exercise.md +++ /dev/null @@ -1,50 +0,0 @@ -# Exercise: Linked List - -1. In [LinkedList class](https://github.com/codebasics/py/blob/master/DataStructures/3_LinkedList/3_linked_list.py) that we implemented in our tutorial add following two methods, -``` -def insert_after_value(self, data_after, data_to_insert): - # Search for first occurance of data_after value in linked list - # Now insert data_to_insert after data_after node - -def remove_by_value(self, data): - # Remove first node that contains data -``` -Now make following calls, -``` - ll = LinkedList() - ll.insert_values(["banana","mango","grapes","orange"]) - ll.print() - ll.insert_after_value("mango","apple") # insert apple after mango - ll.print() - ll.remove_by_value("orange") # remove orange from linked list - ll.print() - ll.remove_by_value("figs") - ll.print() - ll.remove_by_value("banana") - ll.remove_by_value("mango") - ll.remove_by_value("apple") - ll.remove_by_value("grapes") - ll.print() -``` -[Solution](https://github.com/codebasics/py/blob/master/DataStructures/3_LinkedList/Solution/singly_linked_list_exercise.py) - -2. Implement doubly linked list. The only difference with regular linked list is that double linked has prev node reference as well. That way you can iterate in forward and backward direction. -Your node class will look this this, -``` -class Node: - def __init__(self, data=None, next=None, prev=None): - self.data = data - self.next = next - self.prev = prev -``` -Add following new methods, -``` -def print_forward(self): - # This method prints list in forward direction. Use node.next - -def print_backward(self): - # Print linked list in reverse direction. Use node.prev for this. -``` -Implement all other methods in [regular linked list class](https://github.com/codebasics/py/blob/master/DataStructures/3_LinkedList/3_linked_list.py) and make necessary changes for doubly linked list (you need to populate node.prev in all those methods) - -[Solution](https://github.com/codebasics/py/blob/master/DataStructures/3_LinkedList/Solution/doubly_linked_list_exercise.py) \ No newline at end of file diff --git a/DataStructures/3_LinkedList/Solution/doubly_linked_list_exercise.py b/DataStructures/3_LinkedList/Solution/doubly_linked_list_exercise.py deleted file mode 100644 index 0c560b47..00000000 --- a/DataStructures/3_LinkedList/Solution/doubly_linked_list_exercise.py +++ /dev/null @@ -1,131 +0,0 @@ -class Node: - def __init__(self, data=None, next=None, prev=None): - self.data = data - self.next = next - self.prev = prev - -class DoublyLinkedList: - def __init__(self): - self.head = None - - def print_forward(self): - if self.head is None: - print("Linked list is empty") - return - - itr = self.head - llstr = '' - while itr: - llstr += str(itr.data) + ' --> ' - itr = itr.next - print(llstr) - - def print_backward(self): - if self.head is None: - print("Linked list is empty") - return - - last_node = self.get_last_node() - itr = last_node - llstr = '' - while itr: - llstr += itr.data + '-->' - itr = itr.prev - print("Link list in reverse: ", llstr) - - def get_last_node(self): - itr = self.head - while itr.next: - itr = itr.next - - return itr - - def get_length(self): - count = 0 - itr = self.head - while itr: - count+=1 - itr = itr.next - - return count - - def insert_at_begining(self, data): - node = Node(data, self.head, None) - self.head.prev = node - self.head = node - - def insert_at_end(self, data): - if self.head is None: - self.head = Node(data, None, None) - return - - itr = self.head - - while itr.next: - itr = itr.next - - itr.next = Node(data, None, itr) - - def insert_at(self, index, data): - if index<0 or index>self.get_length(): - raise Exception("Invalid Index") - - if index==0: - self.insert_at_begining(data) - return - - count = 0 - itr = self.head - while itr: - if count == index - 1: - node = Node(data, itr.next, itr) - if node.next: - node.next.prev = node - itr.next = node - break - - itr = itr.next - count += 1 - - def remove_at(self, index): - if index<0 or index>=self.get_length(): - raise Exception("Invalid Index") - - if index==0: - self.head = self.head.next - self.head.prev = None - return - - count = 0 - itr = self.head - while itr: - if count == index: - itr.prev.next = itr.next - if itr.next: - itr.next.prev = itr.prev - break - - itr = itr.next - count+=1 - - def insert_values(self, data_list): - self.head = None - for data in data_list: - self.insert_at_end(data) - - -if __name__ == '__main__': - ll = DoublyLinkedList() - ll.insert_values(["banana","mango","grapes","orange"]) - ll.print_forward() - ll.print_backward() - ll.insert_at_end("figs") - ll.print_forward() - ll.insert_at(0,"jackfruit") - ll.print_forward() - ll.insert_at(6,"dates") - ll.print_forward() - ll.insert_at(2,"kiwi") - ll.print_forward() - - diff --git a/DataStructures/3_LinkedList/Solution/singly_linked_list_exercise.py b/DataStructures/3_LinkedList/Solution/singly_linked_list_exercise.py deleted file mode 100644 index cce871c2..00000000 --- a/DataStructures/3_LinkedList/Solution/singly_linked_list_exercise.py +++ /dev/null @@ -1,140 +0,0 @@ -class Node: - def __init__(self, data=None, next=None): - self.data = data - self.next = next - -class LinkedList: - def __init__(self): - self.head = None - - def print(self): - if self.head is None: - print("Linked list is empty") - return - - itr = self.head - llstr = '' - while itr: - llstr += str(itr.data) + ' --> ' - itr = itr.next - print(llstr) - - def get_length(self): - count = 0 - itr = self.head - while itr: - count+=1 - itr = itr.next - - return count - - def insert_at_begining(self, data): - node = Node(data, self.head) - self.head = node - - def insert_at_end(self, data): - if self.head is None: - self.head = Node(data, None) - return - - itr = self.head - - while itr.next: - itr = itr.next - - itr.next = Node(data, None) - - def insert_at(self, index, data): - if index<0 or index>self.get_length(): - raise Exception("Invalid Index") - - if index==0: - self.insert_at_begining(data) - return - - count = 0 - itr = self.head - while itr: - if count == index - 1: - node = Node(data, itr.next) - itr.next = node - break - - itr = itr.next - count += 1 - - def remove_at(self, index): - if index<0 or index>=self.get_length(): - raise Exception("Invalid Index") - - if index==0: - self.head = self.head.next - return - - count = 0 - itr = self.head - while itr: - if count == index - 1: - itr.next = itr.next.next - break - - itr = itr.next - count+=1 - - def insert_values(self, data_list): - self.head = None - for data in data_list: - self.insert_at_end(data) - - - def insert_after_value(self, data_after, data_to_insert): - if self.head is None: - return - - if self.head.data==data_after: - self.head.next = Node(data_to_insert,self.head.next) - return - - itr = self.head - while itr: - if itr.data == data_after: - itr.next = Node(data_to_insert, itr.next) - break - - itr = itr.next - - def remove_by_value(self, data): - if self.head is None: - return - - if self.head.data == data: - self.head = self.head.next - return - - itr = self.head - while itr.next: - if itr.next.data == data: - itr.next = itr.next.next - break - itr = itr.next - -if __name__ == '__main__': - ll = LinkedList() - ll.insert_values(["banana","mango","grapes","orange"]) - ll.print() - ll.insert_after_value("mango","apple") - ll.print() - ll.remove_by_value("orange") - ll.print() - ll.remove_by_value("figs") - ll.print() - ll.remove_by_value("banana") - ll.remove_by_value("mango") - ll.remove_by_value("apple") - ll.remove_by_value("grapes") - ll.print() - - # ll.insert_values([45,7,12,567,99]) - # ll.insert_at_end(67) - # ll.print() - diff --git a/DataStructures/4_HashTable/4_HashTable.ipynb b/DataStructures/4_HashTable/4_HashTable.ipynb deleted file mode 100644 index 04422b6d..00000000 --- a/DataStructures/4_HashTable/4_HashTable.ipynb +++ /dev/null @@ -1,566 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "stock_prices = []\n", - "with open(\"stock_prices.csv\",\"r\") as f:\n", - " for line in f:\n", - " tokens = line.split(',')\n", - " day = tokens[0]\n", - " price = float(tokens[1])\n", - " stock_prices.append([day,price])" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[['march 6', 310.0],\n", - " ['march 7', 340.0],\n", - " ['march 8', 380.0],\n", - " ['march 9', 302.0],\n", - " ['march 10', 297.0],\n", - " ['march 11', 323.0]]" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stock_prices" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['march 6', 310.0]" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stock_prices[0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

Find stock price on March 9

" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "302.0\n" - ] - } - ], - "source": [ - "for element in stock_prices:\n", - " if element[0] == 'march 9':\n", - " print(element[1])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

Complexity of search using a list is O(n)

" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

Process using python dictionary

" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "stock_prices = {}\n", - "with open(\"stock_prices.csv\",\"r\") as f:\n", - " for line in f:\n", - " tokens = line.split(',')\n", - " day = tokens[0]\n", - " price = float(tokens[1])\n", - " stock_prices[day] = price" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'march 6': 310.0,\n", - " 'march 7': 340.0,\n", - " 'march 8': 380.0,\n", - " 'march 9': 302.0,\n", - " 'march 10': 297.0,\n", - " 'march 11': 323.0}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stock_prices" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

Find stock price on March 9

" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "302.0" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stock_prices['march 9']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

Complexity of search using dictionary is O(1)

" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

Implement Hash Table

" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "def get_hash(key):\n", - " hash = 0\n", - " for char in key:\n", - " hash += ord(char)\n", - " return hash % 100" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "9" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "get_hash('march 6')" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "class HashTable: \n", - " def __init__(self):\n", - " self.MAX = 100\n", - " self.arr = [None for i in range(self.MAX)]\n", - " \n", - " def get_hash(self, key):\n", - " hash = 0\n", - " for char in key:\n", - " hash += ord(char)\n", - " return hash % self.MAX\n", - " \n", - " def __getitem__(self, index):\n", - " h = self.get_hash(index)\n", - " return self.arr[h]\n", - " \n", - " def __setitem__(self, key, val):\n", - " h = self.get_hash(key)\n", - " self.arr[h] = val \n", - " \n", - " def __delitem__(self, key):\n", - " h = self.get_hash(key)\n", - " self.arr[h] = None " - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "t = HashTable()\n", - "t[\"march 6\"] = 310\n", - "t[\"march 7\"] = 420" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " 310,\n", - " 420,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t.arr" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "t[\"dec 30\"] = 88" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "88" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t[\"dec 30\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "del t[\"march 6\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " 420,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " 88,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None,\n", - " None]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t.arr" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/DataStructures/4_HashTable/stock_prices.csv b/DataStructures/4_HashTable/stock_prices.csv deleted file mode 100644 index 2337b028..00000000 --- a/DataStructures/4_HashTable/stock_prices.csv +++ /dev/null @@ -1,6 +0,0 @@ -march 6,310 -march 7,340 -march 8,380 -march 9,302 -march 10,297 -march 11,323 \ No newline at end of file diff --git a/DataStructures/4_HashTable_2_Collisions/4_hash_table_collision_handling.ipynb b/DataStructures/4_HashTable_2_Collisions/4_hash_table_collision_handling.ipynb deleted file mode 100644 index 0cebc4e7..00000000 --- a/DataStructures/4_HashTable_2_Collisions/4_hash_table_collision_handling.ipynb +++ /dev/null @@ -1,338 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [], - "source": [ - "class HashTable: \n", - " def __init__(self):\n", - " self.MAX = 10\n", - " self.arr = [None for i in range(self.MAX)]\n", - " \n", - " def get_hash(self, key):\n", - " hash = 0\n", - " for char in key:\n", - " hash += ord(char)\n", - " return hash % self.MAX\n", - " \n", - " def __getitem__(self, index):\n", - " h = self.get_hash(index)\n", - " return self.arr[h]\n", - " \n", - " def __setitem__(self, key, val):\n", - " h = self.get_hash(key)\n", - " self.arr[h] = val " - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "9" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t = HashTable()\n", - "t.get_hash(\"march 6\")" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "9" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t.get_hash(\"march 17\")" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [], - "source": [ - "t[\"march 6\"] = 120\n", - "t[\"march 8\"] = 67\n", - "t[\"march 9\"] = 4\n", - "t[\"march 17\"] = 459" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "459" - ] - }, - "execution_count": 55, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t[\"march 6\"]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

Hash Table Collision Handling Using Chaining

" - ] - }, - { - "cell_type": "code", - "execution_count": 86, - "metadata": {}, - "outputs": [], - "source": [ - "class HashTable: \n", - " def __init__(self):\n", - " self.MAX = 10\n", - " self.arr = [[] for i in range(self.MAX)]\n", - " \n", - " def get_hash(self, key):\n", - " hash = 0\n", - " for char in key:\n", - " hash += ord(char)\n", - " return hash % self.MAX\n", - " \n", - " def __getitem__(self, key):\n", - " arr_index = self.get_hash(key)\n", - " for kv in self.arr[arr_index]:\n", - " if kv[0] == key:\n", - " return kv[1]\n", - " \n", - " def __setitem__(self, key, val):\n", - " h = self.get_hash(key)\n", - " found = False\n", - " for idx, element in enumerate(self.arr[h]):\n", - " if len(element)==2 and element[0] == key:\n", - " self.arr[h][idx] = (key,val)\n", - " found = True\n", - " if not found:\n", - " self.arr[h].append((key,val))\n", - " \n", - " def __delitem__(self, key):\n", - " arr_index = self.get_hash(key)\n", - " for index, kv in enumerate(self.arr[arr_index]):\n", - " if kv[0] == key:\n", - " print(\"del\",index)\n", - " del self.arr[arr_index][index]\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 87, - "metadata": {}, - "outputs": [], - "source": [ - "t = HashTable()\n", - "t[\"march 6\"] = 310\n", - "t[\"march 7\"] = 420\n", - "t[\"march 8\"] = 67\n", - "t[\"march 17\"] = 63457" - ] - }, - { - "cell_type": "code", - "execution_count": 88, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "310" - ] - }, - "execution_count": 88, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t[\"march 6\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 89, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "63457" - ] - }, - "execution_count": 89, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t[\"march 17\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 90, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[[('march 7', 420)],\n", - " [('march 8', 67)],\n", - " [],\n", - " [],\n", - " [],\n", - " [],\n", - " [],\n", - " [],\n", - " [],\n", - " [('march 6', 310), ('march 17', 63457)]]" - ] - }, - "execution_count": 90, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t.arr" - ] - }, - { - "cell_type": "code", - "execution_count": 91, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "t[\"march 6\"] = 11" - ] - }, - { - "cell_type": "code", - "execution_count": 92, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[[('march 7', 420)],\n", - " [('march 8', 67)],\n", - " [],\n", - " [],\n", - " [],\n", - " [],\n", - " [],\n", - " [],\n", - " [],\n", - " [('march 6', 11), ('march 17', 63457)]]" - ] - }, - "execution_count": 92, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t.arr" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "310" - ] - }, - "execution_count": 68, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t[\"march 6\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "del 0\n" - ] - } - ], - "source": [ - "del t[\"march 6\"]" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/DataStructures/4_HashTable_2_Collisions/4_hash_table_exercise.md b/DataStructures/4_HashTable_2_Collisions/4_hash_table_exercise.md deleted file mode 100644 index 2ae3acf1..00000000 --- a/DataStructures/4_HashTable_2_Collisions/4_hash_table_exercise.md +++ /dev/null @@ -1,31 +0,0 @@ -# Exercise: Hash Table - -1. [nyc_weather.csv](https://github.com/codebasics/py/blob/master/DataStructures/4_HashTable_2_Collisions/Solution/nyc_weather.csv) contains new york city weather for first few days in the month of January. Write a program that can answer following, - 1. What was the average temperature in first week of Jan - 1. What was the maximum temperature in first 10 days of Jan - -Figure out data structure that is best for this problem - -[Solution](https://github.com/codebasics/py/blob/master/DataStructures/4_HashTable_2_Collisions/Solution/weather_analysis.ipynb) - -2. [nyc_weather.csv](https://github.com/codebasics/py/blob/master/DataStructures/4_HashTable_2_Collisions/Solution/nyc_weather.csv) contains new york city weather for first few days in the month of January. Write a program that can answer following, - 1. What was the temperature on Jan 9? - 1. What was the temperature on Jan 4? - -Figure out data structure that is best for this problem - -[Solution](https://github.com/codebasics/py/blob/master/DataStructures/4_HashTable_2_Collisions/Solution/weather_analysis.ipynb) - -3. [poem.txt](https://github.com/codebasics/py/blob/master/DataStructures/4_HashTable_2_Collisions/Solution/poem.txt) Contains famous poem "Road not taken" by poet Robert Frost. You have to read this file in python and print every word and its count as show below. Think about the best data structure that you can use to solve this problem and figure out why you selected that specific data structure. -``` - 'diverged': 2, - 'in': 3, - 'I': 8 -``` - -[Solution](https://github.com/codebasics/py/blob/master/DataStructures/4_HashTable_2_Collisions/Solution/exercise_poem_find_word_occurances.ipynb) - -4. Implement hash table where collisions are handled using linear probing. We learnt about linear probing in the video tutorial. Take the hash table implementation that uses chaining and modify methods to use **linear probing**. Keep MAX size of arr in hashtable as 10. - -[Solution](https://github.com/codebasics/py/blob/master/DataStructures/4_HashTable_2_Collisions/Solution/exercise_hash_table_linear_probing.ipynb) - diff --git a/DataStructures/4_HashTable_2_Collisions/Solution/exercise_hash_table_linear_probing.ipynb b/DataStructures/4_HashTable_2_Collisions/Solution/exercise_hash_table_linear_probing.ipynb deleted file mode 100644 index 88f91225..00000000 --- a/DataStructures/4_HashTable_2_Collisions/Solution/exercise_hash_table_linear_probing.ipynb +++ /dev/null @@ -1,428 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

Implement hash table collision handling using linear probing

" - ] - }, - { - "cell_type": "code", - "execution_count": 115, - "metadata": {}, - "outputs": [], - "source": [ - "class HashTable: \n", - " def __init__(self):\n", - " self.MAX = 10 # I am keeping size very low to demonstrate linear probing easily but usually the size should be high\n", - " self.arr = [None for i in range(self.MAX)]\n", - " \n", - " def get_hash(self, key):\n", - " hash = 0\n", - " for char in key:\n", - " hash += ord(char)\n", - " return hash % self.MAX\n", - " \n", - " def __getitem__(self, key):\n", - " h = self.get_hash(key)\n", - " if self.arr[h] is None:\n", - " return\n", - " prob_range = self.get_prob_range(h)\n", - " for prob_index in prob_range:\n", - " element = self.arr[prob_index]\n", - " if element is None:\n", - " return\n", - " if element[0] == key:\n", - " return element[1]\n", - " \n", - " def __setitem__(self, key, val):\n", - " h = self.get_hash(key)\n", - " if self.arr[h] is None:\n", - " self.arr[h] = (key,val)\n", - " else:\n", - " new_h = self.find_slot(key, h)\n", - " self.arr[new_h] = (key,val)\n", - " print(self.arr)\n", - " \n", - " def get_prob_range(self, index):\n", - " return [*range(index, len(self.arr))] + [*range(0,index)]\n", - " \n", - " def find_slot(self, key, index):\n", - " prob_range = self.get_prob_range(index)\n", - " for prob_index in prob_range:\n", - " if self.arr[prob_index] is None:\n", - " return prob_index\n", - " if self.arr[prob_index][0] == key:\n", - " return prob_index\n", - " raise Exception(\"Hashmap full\")\n", - " \n", - " def __delitem__(self, key):\n", - " h = self.get_hash(key)\n", - " prob_range = self.get_prob_range(h)\n", - " for prob_index in prob_range:\n", - " if self.arr[prob_index] is None:\n", - " return # item not found so return. You can also throw exception\n", - " if self.arr[prob_index][0] == key:\n", - " self.arr[prob_index]=None\n", - " print(self.arr)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Function to show how *range(x,y) works. It returns a list of numbers in range(x,y)**" - ] - }, - { - "cell_type": "code", - "execution_count": 116, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[5, 6, 7, 0, 1, 2, 3]" - ] - }, - "execution_count": 116, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "[*range(5,8)] + [*range(0,4)]" - ] - }, - { - "cell_type": "code", - "execution_count": 117, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[None, None, None, None, None, None, None, None, None, ('march 6', 20)]\n", - "[('march 17', 88), None, None, None, None, None, None, None, None, ('march 6', 20)]\n" - ] - } - ], - "source": [ - "t = HashTable()\n", - "t[\"march 6\"] = 20\n", - "t[\"march 17\"] = 88" - ] - }, - { - "cell_type": "code", - "execution_count": 118, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('march 17', 29), None, None, None, None, None, None, None, None, ('march 6', 20)]\n" - ] - } - ], - "source": [ - "t[\"march 17\"] = 29" - ] - }, - { - "cell_type": "code", - "execution_count": 119, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('march 17', 29), ('nov 1', 1), None, None, None, None, None, None, None, ('march 6', 20)]\n" - ] - } - ], - "source": [ - "t[\"nov 1\"] = 1" - ] - }, - { - "cell_type": "code", - "execution_count": 120, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('march 17', 29), ('nov 1', 1), None, None, None, None, None, ('march 33', 234), None, ('march 6', 20)]\n" - ] - } - ], - "source": [ - "t[\"march 33\"] = 234" - ] - }, - { - "cell_type": "code", - "execution_count": 121, - "metadata": {}, - "outputs": [], - "source": [ - "t[\"dec 1\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 122, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "234" - ] - }, - "execution_count": 122, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t[\"march 33\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 123, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('march 17', 29), ('nov 1', 1), None, None, None, None, None, ('march 33', 999), None, ('march 6', 20)]\n" - ] - } - ], - "source": [ - "t[\"march 33\"] = 999" - ] - }, - { - "cell_type": "code", - "execution_count": 124, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "999" - ] - }, - "execution_count": 124, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t[\"march 33\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 125, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('march 17', 29), ('nov 1', 1), None, None, None, None, None, ('march 33', 999), ('april 1', 87), ('march 6', 20)]\n" - ] - } - ], - "source": [ - "t[\"april 1\"]=87" - ] - }, - { - "cell_type": "code", - "execution_count": 126, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('march 17', 29), ('nov 1', 1), ('april 2', 123), None, None, None, None, ('march 33', 999), ('april 1', 87), ('march 6', 20)]\n" - ] - } - ], - "source": [ - "t[\"april 2\"]=123" - ] - }, - { - "cell_type": "code", - "execution_count": 127, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('march 17', 29), ('nov 1', 1), ('april 2', 123), ('april 3', 234234), None, None, None, ('march 33', 999), ('april 1', 87), ('march 6', 20)]\n" - ] - } - ], - "source": [ - "t[\"april 3\"]=234234" - ] - }, - { - "cell_type": "code", - "execution_count": 128, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('march 17', 29), ('nov 1', 1), ('april 2', 123), ('april 3', 234234), ('april 4', 91), None, None, ('march 33', 999), ('april 1', 87), ('march 6', 20)]\n" - ] - } - ], - "source": [ - "t[\"april 4\"]=91" - ] - }, - { - "cell_type": "code", - "execution_count": 129, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('march 17', 29), ('nov 1', 1), ('april 2', 123), ('april 3', 234234), ('april 4', 91), ('May 22', 4), None, ('march 33', 999), ('april 1', 87), ('march 6', 20)]\n" - ] - } - ], - "source": [ - "t[\"May 22\"]=4" - ] - }, - { - "cell_type": "code", - "execution_count": 130, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('march 17', 29), ('nov 1', 1), ('april 2', 123), ('april 3', 234234), ('april 4', 91), ('May 22', 4), ('May 7', 47), ('march 33', 999), ('april 1', 87), ('march 6', 20)]\n" - ] - } - ], - "source": [ - "t[\"May 7\"]=47" - ] - }, - { - "cell_type": "code", - "execution_count": 131, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "ename": "Exception", - "evalue": "Hashmap full", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mException\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mt\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"Jan 1\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[1;32m\u001b[0m in \u001b[0;36m__setitem__\u001b[1;34m(self, key, val)\u001b[0m\n\u001b[0;32m 27\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marr\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mh\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mval\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 28\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 29\u001b[1;33m \u001b[0mnew_h\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfind_slot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mh\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 30\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marr\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mnew_h\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mval\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 31\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m\u001b[0m in \u001b[0;36mfind_slot\u001b[1;34m(self, key, index)\u001b[0m\n\u001b[0;32m 41\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marr\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mprob_index\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m==\u001b[0m \u001b[0mkey\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 42\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mprob_index\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 43\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Hashmap full\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 44\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 45\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__delitem__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mException\u001b[0m: Hashmap full" - ] - } - ], - "source": [ - "t[\"Jan 1\"]=0" - ] - }, - { - "cell_type": "code", - "execution_count": 133, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('march 17', 29), ('nov 1', 1), None, ('april 3', 234234), ('april 4', 91), ('May 22', 4), ('May 7', 47), ('march 33', 999), ('april 1', 87), ('march 6', 20)]\n" - ] - } - ], - "source": [ - "del t[\"april 2\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 134, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('march 17', 29), ('nov 1', 1), ('Jan 1', 0), ('april 3', 234234), ('april 4', 91), ('May 22', 4), ('May 7', 47), ('march 33', 999), ('april 1', 87), ('march 6', 20)]\n" - ] - } - ], - "source": [ - "t[\"Jan 1\"]=0" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/DataStructures/4_HashTable_2_Collisions/Solution/exercise_poem_find_word_occurances.ipynb b/DataStructures/4_HashTable_2_Collisions/Solution/exercise_poem_find_word_occurances.ipynb deleted file mode 100644 index 052edb0f..00000000 --- a/DataStructures/4_HashTable_2_Collisions/Solution/exercise_poem_find_word_occurances.ipynb +++ /dev/null @@ -1,226 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Two roads diverged in a yellow wood,\n", - "\n", - "And sorry I could not travel both\n", - "\n", - "And be one traveler, long I stood\n", - "\n", - "And looked down one as far as I could\n", - "\n", - "To where it bent in the undergrowth;\n", - "\n", - "\n", - "\n", - "Then took the other, as just as fair,\n", - "\n", - "And having perhaps the better claim,\n", - "\n", - "Because it was grassy and wanted wear;\n", - "\n", - "Though as for that the passing there\n", - "\n", - "Had worn them really about the same,\n", - "\n", - "\n", - "\n", - "And both that morning equally lay\n", - "\n", - "In leaves no step had trodden black.\n", - "\n", - "Oh, I kept the first for another day!\n", - "\n", - "Yet knowing how way leads on to way,\n", - "\n", - "I doubted if I should ever come back.\n", - "\n", - "\n", - "\n", - "I shall be telling this with a sigh\n", - "\n", - "Somewhere ages and ages hence:\n", - "\n", - "Two roads diverged in a wood, and I—\n", - "\n", - "I took the one less traveled by,\n", - "\n", - "And that has made all the difference.\n" - ] - } - ], - "source": [ - "with open(\"poem.txt\",\"r\") as f:\n", - " for line in f:\n", - " print(line)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "word_count = {}\n", - "with open(\"poem.txt\",\"r\") as f:\n", - " for line in f:\n", - " tokens = line.split(' ')\n", - " for token in tokens:\n", - " token=token.replace('\\n','')\n", - " if token in word_count:\n", - " word_count[token]+=1\n", - " else:\n", - " word_count[token]=1" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'Two': 2,\n", - " 'roads': 2,\n", - " 'diverged': 2,\n", - " 'in': 3,\n", - " 'a': 3,\n", - " 'yellow': 1,\n", - " 'wood,': 2,\n", - " 'And': 6,\n", - " 'sorry': 1,\n", - " 'I': 8,\n", - " 'could': 2,\n", - " 'not': 1,\n", - " 'travel': 1,\n", - " 'both': 2,\n", - " 'be': 2,\n", - " 'one': 3,\n", - " 'traveler,': 1,\n", - " 'long': 1,\n", - " 'stood': 1,\n", - " 'looked': 1,\n", - " 'down': 1,\n", - " 'as': 5,\n", - " 'far': 1,\n", - " 'To': 1,\n", - " 'where': 1,\n", - " 'it': 2,\n", - " 'bent': 1,\n", - " 'the': 8,\n", - " 'undergrowth;': 1,\n", - " '': 3,\n", - " 'Then': 1,\n", - " 'took': 2,\n", - " 'other,': 1,\n", - " 'just': 1,\n", - " 'fair,': 1,\n", - " 'having': 1,\n", - " 'perhaps': 1,\n", - " 'better': 1,\n", - " 'claim,': 1,\n", - " 'Because': 1,\n", - " 'was': 1,\n", - " 'grassy': 1,\n", - " 'and': 3,\n", - " 'wanted': 1,\n", - " 'wear;': 1,\n", - " 'Though': 1,\n", - " 'for': 2,\n", - " 'that': 3,\n", - " 'passing': 1,\n", - " 'there': 1,\n", - " 'Had': 1,\n", - " 'worn': 1,\n", - " 'them': 1,\n", - " 'really': 1,\n", - " 'about': 1,\n", - " 'same,': 1,\n", - " 'morning': 1,\n", - " 'equally': 1,\n", - " 'lay': 1,\n", - " 'In': 1,\n", - " 'leaves': 1,\n", - " 'no': 1,\n", - " 'step': 1,\n", - " 'had': 1,\n", - " 'trodden': 1,\n", - " 'black.': 1,\n", - " 'Oh,': 1,\n", - " 'kept': 1,\n", - " 'first': 1,\n", - " 'another': 1,\n", - " 'day!': 1,\n", - " 'Yet': 1,\n", - " 'knowing': 1,\n", - " 'how': 1,\n", - " 'way': 1,\n", - " 'leads': 1,\n", - " 'on': 1,\n", - " 'to': 1,\n", - " 'way,': 1,\n", - " 'doubted': 1,\n", - " 'if': 1,\n", - " 'should': 1,\n", - " 'ever': 1,\n", - " 'come': 1,\n", - " 'back.': 1,\n", - " 'shall': 1,\n", - " 'telling': 1,\n", - " 'this': 1,\n", - " 'with': 1,\n", - " 'sigh': 1,\n", - " 'Somewhere': 1,\n", - " 'ages': 2,\n", - " 'hence:': 1,\n", - " 'I—': 1,\n", - " 'less': 1,\n", - " 'traveled': 1,\n", - " 'by,': 1,\n", - " 'has': 1,\n", - " 'made': 1,\n", - " 'all': 1,\n", - " 'difference.': 1}" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "word_count" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/DataStructures/4_HashTable_2_Collisions/Solution/nyc_weather.csv b/DataStructures/4_HashTable_2_Collisions/Solution/nyc_weather.csv deleted file mode 100644 index 0aef64ae..00000000 --- a/DataStructures/4_HashTable_2_Collisions/Solution/nyc_weather.csv +++ /dev/null @@ -1,11 +0,0 @@ -date,temperature(F) -Jan 1,27 -Jan 2,31 -Jan 3,23 -Jan 4,34 -Jan 5,37 -Jan 6,38 -Jan 7,29 -Jan 8,30 -Jan 9,35 -Jan 10,30 \ No newline at end of file diff --git a/DataStructures/4_HashTable_2_Collisions/Solution/poem.txt b/DataStructures/4_HashTable_2_Collisions/Solution/poem.txt deleted file mode 100644 index e6b7466e..00000000 --- a/DataStructures/4_HashTable_2_Collisions/Solution/poem.txt +++ /dev/null @@ -1,23 +0,0 @@ -Two roads diverged in a yellow wood, -And sorry I could not travel both -And be one traveler, long I stood -And looked down one as far as I could -To where it bent in the undergrowth; - -Then took the other, as just as fair, -And having perhaps the better claim, -Because it was grassy and wanted wear; -Though as for that the passing there -Had worn them really about the same, - -And both that morning equally lay -In leaves no step had trodden black. -Oh, I kept the first for another day! -Yet knowing how way leads on to way, -I doubted if I should ever come back. - -I shall be telling this with a sigh -Somewhere ages and ages hence: -Two roads diverged in a wood, and I— -I took the one less traveled by, -And that has made all the difference. \ No newline at end of file diff --git a/DataStructures/4_HashTable_2_Collisions/Solution/weather_analysis.ipynb b/DataStructures/4_HashTable_2_Collisions/Solution/weather_analysis.ipynb deleted file mode 100644 index 4de4efc3..00000000 --- a/DataStructures/4_HashTable_2_Collisions/Solution/weather_analysis.ipynb +++ /dev/null @@ -1,310 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

Exercise: Hash Table: New York City Weather Analysis

" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "**(1)** nyc_weather.csv contains new york city weather for first few days in the month of January. Write a program that can answer following, \n", - "\n", - " (a) What was the average temperature in first week of Jan\n", - "\n", - " (b) What was the maximum temperature in first 10 days of Jan\n", - "\n", - " Figure out data structure that is best for this problem" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Invalid temperature.Ignore the row\n" - ] - } - ], - "source": [ - "arr = []\n", - "\n", - "with open(\"nyc_weather.csv\",\"r\") as f:\n", - " for line in f:\n", - " tokens = line.split(',')\n", - " try:\n", - " temperature = int(tokens[1])\n", - " arr.append(temperature)\n", - " except:\n", - " print(\"Invalid temperature.Ignore the row\")" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[27, 31, 23, 34, 37, 38, 29, 30, 35, 30]" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**What was the average temperature in first week of Jan**" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "31.285714285714285" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sum(arr[0:7])/len(arr[0:7])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**What was the maximum temperature in first 10 days of Jan**" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[27, 31, 23, 34, 37, 38, 29, 30, 35, 30]" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr[0:10]" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "38" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "max(arr[0:10])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**The best data structure to use here was a list because all we wanted was access of temperature elements**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "**(2)** nyc_weather.csv contains new york city weather for first few days in the month of January. Write a program that can answer following, \n", - "\n", - " (a) What was the temperature on Jan 9?\n", - "\n", - " (b) What was the temperature on Jan 4?\n", - "\n", - " Figure out data structure that is best for this problem" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Invalid temperature.Ignore the row\n" - ] - } - ], - "source": [ - "weather_dict = {}\n", - "\n", - "with open(\"nyc_weather.csv\",\"r\") as f:\n", - " for line in f:\n", - " tokens = line.split(',')\n", - " day = tokens[0]\n", - " try:\n", - " temperature = int(tokens[1])\n", - " weather_dict[day] = temperature\n", - " except:\n", - " print(\"Invalid temperature.Ignore the row\")" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'Jan 1': 27,\n", - " 'Jan 2': 31,\n", - " 'Jan 3': 23,\n", - " 'Jan 4': 34,\n", - " 'Jan 5': 37,\n", - " 'Jan 6': 38,\n", - " 'Jan 7': 29,\n", - " 'Jan 8': 30,\n", - " 'Jan 9': 35,\n", - " 'Jan 10': 30}" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "weather_dict" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**What was the temperature on Jan 9**" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "35" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "weather_dict['Jan 9']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**What was the temperature on Jan 4**" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "34" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "weather_dict['Jan 4']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**The best data structure to use here was a dictionary (internally a hash table) because we wanted to know temperature for specific day, requiring key, value pair access where you can look up an element by day using O(1) complexity**" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/DataStructures/5_Stack/5_stack.ipynb b/DataStructures/5_Stack/5_stack.ipynb deleted file mode 100644 index 4f8ad4bc..00000000 --- a/DataStructures/5_Stack/5_stack.ipynb +++ /dev/null @@ -1,669 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

Data Structures Tutorial: Stack

" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

Using a list as a stack

" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "s = []\n", - "s.append('https://www.cnn.com/')\n", - "s.append('https://www.cnn.com/world')\n", - "s.append('https://www.cnn.com/india')\n", - "s.append('https://www.cnn.com/china')" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'https://www.cnn.com/china'" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'https://www.cnn.com/india'" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['https://www.cnn.com/', 'https://www.cnn.com/world']" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'https://www.cnn.com/world'" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s[-1]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**The issue with using a list as a stack is that list uses dymanic array internally and when it reaches its capacity it will reallocate a big chunk of memory somewhere else in memory area and copy all the elements. For example in below diagram if a list has a capacity of 10 and we try to insert 11th element, it will not allocate new memory in a different memory region, copy all 10 elements and then insert the 11th element. So overhead here is (1) allocate new memory plus (2) copy all existing elements in new memory area**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

Using deque as a stack

" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from collections import deque\n", - "stack = deque()" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['__add__',\n", - " '__bool__',\n", - " '__class__',\n", - " '__contains__',\n", - " '__copy__',\n", - " '__delattr__',\n", - " '__delitem__',\n", - " '__dir__',\n", - " '__doc__',\n", - " '__eq__',\n", - " '__format__',\n", - " '__ge__',\n", - " '__getattribute__',\n", - " '__getitem__',\n", - " '__gt__',\n", - " '__hash__',\n", - " '__iadd__',\n", - " '__imul__',\n", - " '__init__',\n", - " '__init_subclass__',\n", - " '__iter__',\n", - " '__le__',\n", - " '__len__',\n", - " '__lt__',\n", - " '__mul__',\n", - " '__ne__',\n", - " '__new__',\n", - " '__reduce__',\n", - " '__reduce_ex__',\n", - " '__repr__',\n", - " '__reversed__',\n", - " '__rmul__',\n", - " '__setattr__',\n", - " '__setitem__',\n", - " '__sizeof__',\n", - " '__str__',\n", - " '__subclasshook__',\n", - " 'append',\n", - " 'appendleft',\n", - " 'clear',\n", - " 'copy',\n", - " 'count',\n", - " 'extend',\n", - " 'extendleft',\n", - " 'index',\n", - " 'insert',\n", - " 'maxlen',\n", - " 'pop',\n", - " 'popleft',\n", - " 'remove',\n", - " 'reverse',\n", - " 'rotate']" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dir(stack)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "deque(['https://www.cnn.com/'])" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stack.append(\"https://www.cnn.com/\")\n", - "stack" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "deque(['https://www.cnn.com/', 'https://www.cnn.com/world'])" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stack.append(\"https://www.cnn.com/world\")\n", - "stack" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "deque(['https://www.cnn.com/',\n", - " 'https://www.cnn.com/world',\n", - " 'https://www.cnn.com/india',\n", - " 'https://www.cnn.com/china'])" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stack.append(\"https://www.cnn.com/india\")\n", - "stack.append(\"https://www.cnn.com/china\")\n", - "stack" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'https://www.cnn.com/china'" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stack.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'https://www.cnn.com/india'" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stack.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "deque(['https://www.cnn.com/', 'https://www.cnn.com/world'])" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stack" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'https://www.cnn.com/world'" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stack.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'https://www.cnn.com/'" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stack.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "ename": "IndexError", - "evalue": "pop from an empty deque", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mstack\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[1;31mIndexError\u001b[0m: pop from an empty deque" - ] - } - ], - "source": [ - "stack.pop()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

Implement Stack class using a deque

" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [], - "source": [ - "class Stack:\n", - " def __init__(self):\n", - " self.container = deque()\n", - " \n", - " def push(self,val):\n", - " self.container.append(val)\n", - " \n", - " def pop(self):\n", - " return self.container.pop()\n", - " \n", - " def peek(self):\n", - " return self.container[-1]\n", - " \n", - " def is_empty(self):\n", - " return len(self.container)==0\n", - " \n", - " def size(self):\n", - " return len(self.container)" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [], - "source": [ - "s = Stack()\n", - "s.push(5)" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.is_empty()" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.is_empty()" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [], - "source": [ - "s.push(9)\n", - "s.push(34)\n", - "s.push(78)\n", - "s.push(12)" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "12" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.peek()" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "12" - ] - }, - "execution_count": 48, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "78" - ] - }, - "execution_count": 49, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "34" - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "9" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "ename": "IndexError", - "evalue": "pop from an empty deque", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0ms\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[1;32m\u001b[0m in \u001b[0;36mpop\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mpop\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 9\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcontainer\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 10\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 11\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mpeek\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mIndexError\u001b[0m: pop from an empty deque" - ] - } - ], - "source": [ - "s.pop()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/DataStructures/5_Stack/5_stack_exercise.md b/DataStructures/5_Stack/5_stack_exercise.md deleted file mode 100644 index 77247536..00000000 --- a/DataStructures/5_Stack/5_stack_exercise.md +++ /dev/null @@ -1,18 +0,0 @@ -## Data structure tutorial exercise: Stack -1. Write a function in python that can reverse a string using stack data structure. Use [Stack class](https://github.com/codebasics/py/tree/master/DataStructures/5_Stack/5_stack.ipynb) from the tutorial. - ``` - reverse_string("We will conquere COVID-19") should return "91-DIVOC ereuqnoc lliw eW" - ``` - -[Solution](https://github.com/codebasics/py/tree/master/DataStructures/5_Stack/Exercise/reverse_string.py) - -2. Write a function in python that checks if paranthesis in the string are balanced or not. Possible parantheses are "{}',"()" or "[]". Use [Stack class](https://github.com/codebasics/py/tree/master/DataStructures/5_Stack/5_stack.ipynb) from the tutorial. - ``` - is_balanced("({a+b})") --> True - is_balanced("))((a+b}{") --> False - is_balanced("((a+b))") --> True - is_balanced("))") --> False - is_balanced("[a+b]*(x+2y)*{gg+kk}") --> True - ``` - -[Solution](https://github.com/codebasics/py/tree/master/DataStructures/5_Stack/Exercise/balance_paran.py) \ No newline at end of file diff --git a/DataStructures/5_Stack/Exercise/balance_paran.py b/DataStructures/5_Stack/Exercise/balance_paran.py deleted file mode 100644 index ec18c4cd..00000000 --- a/DataStructures/5_Stack/Exercise/balance_paran.py +++ /dev/null @@ -1,51 +0,0 @@ -from collections import deque - -class Stack: - def __init__(self): - self.container = deque() - - def push(self, val): - self.container.append(val) - - def pop(self): - return self.container.pop() - - def peek(self): - return self.container[-1] - - def is_empty(self): - return len(self.container) == 0 - - def size(self): - return len(self.container) - -def is_match(ch1, ch2): - match_dict = { - ')': '(', - ']': '[', - '}': '{' - } - return match_dict[ch1] == ch2 - - -def is_balanced(s): - stack = Stack() - for ch in s: - if ch=='(' or ch=='{' or ch == '[': - stack.push(ch) - if ch==')' or ch=='}' or ch == ']': - if stack.size()==0: - return False - if not is_match(ch,stack.pop()): - return False - - return stack.size()==0 - - -if __name__ == '__main__': - print(is_balanced("({a+b})")) - print(is_balanced("))((a+b}{")) - print(is_balanced("((a+b))")) - print(is_balanced("((a+g))")) - print(is_balanced("))")) - print(is_balanced("[a+b]*(x+2y)*{gg+kk}")) diff --git a/DataStructures/5_Stack/Exercise/reverse_string.py b/DataStructures/5_Stack/Exercise/reverse_string.py deleted file mode 100644 index 6c240bf0..00000000 --- a/DataStructures/5_Stack/Exercise/reverse_string.py +++ /dev/null @@ -1,37 +0,0 @@ -from collections import deque - -class Stack: - def __init__(self): - self.container = deque() - - def push(self, val): - self.container.append(val) - - def pop(self): - return self.container.pop() - - def peek(self): - return self.container[-1] - - def is_empty(self): - return len(self.container) == 0 - - def size(self): - return len(self.container) - -def reverse_string(s): - stack = Stack() - - for ch in s: - stack.push(ch) - - rstr = '' - while stack.size()!=0: - rstr += stack.pop() - - return rstr - - -if __name__ == '__main__': - print(reverse_string("We will conquere COVI-19")) - print(reverse_string("I am the king")) \ No newline at end of file diff --git a/DataStructures/5_Stack/dynamic_memory.png b/DataStructures/5_Stack/dynamic_memory.png deleted file mode 100644 index 95c1f579b1eb0eddc4b8a2bbe0ad507d4b4ab156..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23569 zcmdqIWmuG56gE1;00RO8NW)N4Dj+2xEhw#&bcZM)-90FvG}7JO2uPQtNJ)2hcgOb( z@B4mrew;t&*WtPp81}QDz1LprUh7_KZGVNgk~j~@AAmq09BHXnN+1v#@FU6q1_bza zp22Did;{AlNs57r``{bEFQ^}0zIh1(m4#wm8vsL5LKNiQy}rA3%TU#3&8^gfB03Hz)70t=Xp`oFfo0}sgCEeTG>+kR9m?hopqKCo?r_0;d2B!CS4lkyck6+og3FszZ!pKy;x@8(ch=S>HLg`2IJsa=x>(v!tZN&(AL|F7C&VA3Z%i zz8Mqx`ubX0S|%nYn3$M#b#*Wp?D6BrZEbC%^M{_Eo*f+>!otF6XlQ9^X^Dx6Pq?KE zipv?Ea_7`98GP$)?AvsSAHl=Jv$C=p8J}6)IAvvJ<>KOEXJOlsHcL`cGBh-lpP!$Xmse0fH9b9jadFYY!a_$!XJBBUy1Lpms5mAj zMnptpcz8G{D9FITprN6`#l_{@w{HOf0gSBt(Fy4U1O(pR-bF=4fl)cW;dx|aWL&Bd zafxZ4)Mee@t4{ogIsa2MT@h!dCX?=KbKI35;cUYBgbp1IRZ~W!FE8x%3w9w+W(f%i zS)u1xn9$|gl*R;~*3@tA?(ROHw9CUil*C`?y%pPS&E9X%r6eV+jz-|au-}UE#Ce#H zm&I6Vz2SKLXuc}ZSV_WBUrG0k7~eCdWN*vA1>xP_8w` zEAk(>(<&FRSan9}S1;c=>+Ur42GXh3uCYBZ!k~XzO2%HTIBaX{6IG-~OQKWzh(YPO zm?@TlkK2N|G$!%n@PMC2B*oAlpAHJH;5eHl*^JZYRL{P+{jEq?^ZG@z_>%3J8x{!k)*FHfS|)BoevAe~j$pt4|9%`A2lByxMg-lD z`@d>l!xQ;{C4?E%)R8znGd~A04y7nZ6g;Mo2PmLVv`?lEaBPAO+rU Ll8}Pt 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 Structures Tutorial: Queue" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

Using list as a queue

" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "wmt_stock_price_queue = []" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "wmt_stock_price_queue.insert(0,131.10)\n", - "wmt_stock_price_queue.insert(0,132.12)\n", - "wmt_stock_price_queue.insert(0,135)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[135, 132.12, 131.1]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "wmt_stock_price_queue" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "131.1" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "wmt_stock_price_queue.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[135, 132.12]" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "wmt_stock_price_queue" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "132.12" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "wmt_stock_price_queue.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "135" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "wmt_stock_price_queue.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "ename": "IndexError", - "evalue": "pop from empty list", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mwmt_stock_price_queue\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[1;31mIndexError\u001b[0m: pop from empty list" - ] - } - ], - "source": [ - "wmt_stock_price_queue.pop()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

Using collections.deque as a queue

" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "from collections import deque\n", - "q = deque()" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "deque([10, 8, 5])" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "q.appendleft(5)\n", - "q.appendleft(8)\n", - "q.appendleft(10)\n", - "q" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "q.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "deque([10, 8])" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "q" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "8" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "q.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "10" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "q.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "ename": "IndexError", - "evalue": "pop from an empty deque", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mq\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[1;31mIndexError\u001b[0m: pop from an empty deque" - ] - } - ], - "source": [ - "q.pop()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

Implement queue class using collections.deque

" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "from collections import deque\n", - "\n", - "class Queue:\n", - " \n", - " def __init__(self):\n", - " self.buffer = deque()\n", - " \n", - " def enqueue(self, val):\n", - " self.buffer.appendleft(val)\n", - " \n", - " def dequeue(self):\n", - " return self.buffer.pop()\n", - " \n", - " def is_empty(self):\n", - " return len(self.buffer)==0\n", - " \n", - " def size(self):\n", - " return len(self.buffer)" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "pq = Queue()\n", - "\n", - "pq.enqueue({\n", - " 'company': 'Wall Mart',\n", - " 'timestamp': '15 apr, 11.01 AM',\n", - " 'price': 131.10\n", - "})\n", - "pq.enqueue({\n", - " 'company': 'Wall Mart',\n", - " 'timestamp': '15 apr, 11.02 AM',\n", - " 'price': 132\n", - "})\n", - "pq.enqueue({\n", - " 'company': 'Wall Mart',\n", - " 'timestamp': '15 apr, 11.03 AM',\n", - " 'price': 135\n", - "})" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "3" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pq.size()" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'company': 'Wall Mart', 'timestamp': '15 apr, 11.01 AM', 'price': 131.1}" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pq.dequeue()" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'company': 'Wall Mart', 'timestamp': '15 apr, 11.01 AM', 'price': 131.1}" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pq.dequeue()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/DataStructures/6_Queue/6_queue_exercise.md b/DataStructures/6_Queue/6_queue_exercise.md deleted file mode 100644 index 01069301..00000000 --- a/DataStructures/6_Queue/6_queue_exercise.md +++ /dev/null @@ -1,38 +0,0 @@ -## Data structure tutorial exercise: Queue - -For all exercises use [Queue class](https://github.com/codebasics/py/blob/master/DataStructures/6_Queue/6_queue.ipynb) implemented in main tutorial. - -1. Design a food ordering system where your python program will run two threads, - 1. Place Order: This thread will be placing an order and inserting that into a queue. This thread places new order every 0.5 second. (hint: use time.sleep(0.5) function) - 1. Serve Order: This thread will server the order. All you need to do is pop the order out of the queue and print it. This thread serves an order every 2 seconds. Also start this thread 1 second after place order thread is started. - - Use this video to get yourself familiar with [multithreading in python](https://www.youtube.com/watch?v=PJ4t2U15ACo&list=PLeo1K3hjS3uub3PRhdoCTY8BxMKSW7RjN&index=2&t=0s) - - Pass following list as an argument to place order thread, - ``` - orders = ['pizza','samosa','pasta','biryani','burger'] - ``` - This problem is a producer,consumer problem where place_order thread is producing orders whereas server_order thread is consuming the food orders. - Use Queue class implemented in a video tutorial. - -[Solution](https://github.com/codebasics/py/tree/master/DataStructures/6_Queue/Exercise/food_ordering_system.py) - -2. Write a program to print binary numbers from 1 to 10 using Queue. Use Queue class implemented in main tutorial. -Binary sequence should look like, -``` - 1 - 10 - 11 - 100 - 101 - 110 - 111 - 1000 - 1001 - 1010 -``` -Hint: Notice a pattern above. After 1 second and third number is 1+0 and 1+1. 4th and 5th number are second number (i.e. 10) + 0 and second number (i.e. 10) + 1. - -You also need to add front() function in queue class that can return the front element in the queue. - -[Solution](https://github.com/codebasics/py/tree/master/DataStructures/6_Queue/Exercise/binary_numbers.py) diff --git a/DataStructures/6_Queue/Exercise/binary_numbers.py b/DataStructures/6_Queue/Exercise/binary_numbers.py deleted file mode 100644 index 46305410..00000000 --- a/DataStructures/6_Queue/Exercise/binary_numbers.py +++ /dev/null @@ -1,40 +0,0 @@ -from collections import deque - -class Queue: - def __init__(self): - self.buffer = deque() - - def enqueue(self, val): - self.buffer.appendleft(val) - - def dequeue(self): - if len(self.buffer)==0: - print("Queue is empty") - return - - return self.buffer.pop() - - def is_empty(self): - return len(self.buffer) == 0 - - def size(self): - return len(self.buffer) - - def front(self): - return self.buffer[-1] - -def produce_binary_numbers(n): - numbers_queue = Queue() - numbers_queue.enqueue("1") - - for i in range(n): - front = numbers_queue.front() - print(" ", front) - numbers_queue.enqueue(front + "0") - numbers_queue.enqueue(front + "1") - - numbers_queue.dequeue() - - -if __name__ == '__main__': - produce_binary_numbers(10) \ No newline at end of file diff --git a/DataStructures/6_Queue/Exercise/food_ordering_system.py b/DataStructures/6_Queue/Exercise/food_ordering_system.py deleted file mode 100644 index 3658a415..00000000 --- a/DataStructures/6_Queue/Exercise/food_ordering_system.py +++ /dev/null @@ -1,48 +0,0 @@ -import threading -import time - -from collections import deque - -class Queue: - def __init__(self): - self.buffer = deque() - - def enqueue(self, val): - self.buffer.appendleft(val) - - def dequeue(self): - if len(self.buffer)==0: - print("Queue is empty") - return - - return self.buffer.pop() - - def is_empty(self): - return len(self.buffer) == 0 - - def size(self): - return len(self.buffer) - -food_order_queue = Queue() - -def place_orders(orders): - for order in orders: - print("Placing order for:",order) - food_order_queue.enqueue(order) - time.sleep(0.5) - - -def serve_orders(): - time.sleep(1) - while True: - order = food_order_queue.dequeue() - print("Now serving: ",order) - time.sleep(2) - -if __name__ == '__main__': - orders = ['pizza','samosa','pasta','biryani','burger'] - t1 = threading.Thread(target=place_orders, args=(orders,)) - t2 = threading.Thread(target=serve_orders) - - t1.start() - t2.start() \ No newline at end of file diff --git a/DataStructures/7_Tree/7_tree.py b/DataStructures/7_Tree/7_tree.py deleted file mode 100644 index 02d977db..00000000 --- a/DataStructures/7_Tree/7_tree.py +++ /dev/null @@ -1,52 +0,0 @@ -class TreeNode: - def __init__(self, data): - self.data = data - self.children = [] - self.parent = None - - def get_level(self): - level = 0 - p = self.parent - while p: - level += 1 - p = p.parent - - return level - - def print_tree(self): - spaces = ' ' * self.get_level() * 3 - prefix = spaces + "|__" if self.parent else "" - print(prefix + self.data) - if self.children: - for child in self.children: - child.print_tree() - - def add_child(self, child): - child.parent = self - self.children.append(child) - -def build_product_tree(): - root = TreeNode("Electronics") - - laptop = TreeNode("Laptop") - laptop.add_child(TreeNode("Mac")) - laptop.add_child(TreeNode("Surface")) - laptop.add_child(TreeNode("Thinkpad")) - - cellphone = TreeNode("Cell Phone") - cellphone.add_child(TreeNode("iPhone")) - cellphone.add_child(TreeNode("Google Pixel")) - cellphone.add_child(TreeNode("Vivo")) - - tv = TreeNode("TV") - tv.add_child(TreeNode("Samsung")) - tv.add_child(TreeNode("LG")) - - root.add_child(laptop) - root.add_child(cellphone) - root.add_child(tv) - - root.print_tree() - -if __name__ == '__main__': - build_product_tree() \ No newline at end of file diff --git a/DataStructures/7_Tree/7_tree_exercise.md b/DataStructures/7_Tree/7_tree_exercise.md deleted file mode 100644 index b03faa9f..00000000 --- a/DataStructures/7_Tree/7_tree_exercise.md +++ /dev/null @@ -1,34 +0,0 @@ -#### Data structures exercise: General Tree - -1. Below is the management hierarchy of a company. - - ![ss](management_both.PNG) - -Extent [tree class](https://github.com/codebasics/py/blob/master/DataStructures/7_Tree/7_tree.py) built in our -main tutorial so that it takes **name** and **designation** in data part of TreeNode class. -Now extend print_tree function such that it can print either name tree, designation tree or name and designation tree. As shown below, - - ![](all_trees.png) - -Here is how your main function should will look like, -``` -if __name__ == '__main__': - root_node = build_management_tree() - root_node.print_tree("name") # prints only name hierarchy - root_node.print_tree("designation") # prints only designation hierarchy - root_node.print_tree("both") # prints both (name and designation) hierarchy -``` - -[Solution](https://github.com/codebasics/py/blob/master/DataStructures/7_Tree/Exercise/management_hierarchy.py) - -2. Build below location tree using **TreeNode** class - - ![](location_trees.png) - -Now modify print_tree method to take tree level as input. And that should print tree only upto that level as shown below, - - ![](location_trees_all.png) - -[Solution](https://github.com/codebasics/py/blob/master/DataStructures/7_Tree/Exercise/location_hierarchy.py) - - diff --git a/DataStructures/7_Tree/Exercise/location_hierarchy.py b/DataStructures/7_Tree/Exercise/location_hierarchy.py deleted file mode 100644 index 1b9232e7..00000000 --- a/DataStructures/7_Tree/Exercise/location_hierarchy.py +++ /dev/null @@ -1,70 +0,0 @@ -class TreeNode: - def __init__(self, data): - self.data = data - self.children = [] - self.parent = None - - def get_level(self): - level = 0 - p = self.parent - while p: - level += 1 - p = p.parent - - return level - - def print_tree(self, level): - if self.get_level() > level: - return - spaces = ' ' * self.get_level() * 3 - prefix = spaces + "|__" if self.parent else "" - print(prefix + self.data) - if self.children: - for child in self.children: - child.print_tree(level) - - def add_child(self, child): - child.parent = self - self.children.append(child) - -def build_location_tree(): - root = TreeNode("Global") - - india = TreeNode("India") - - gujarat = TreeNode("Gujarat") - gujarat.add_child(TreeNode("Ahmedabad")) - gujarat.add_child(TreeNode("Baroda")) - - karnataka = TreeNode("Karnataka") - karnataka.add_child(TreeNode("Bangluru")) - karnataka.add_child(TreeNode("Mysore")) - - india.add_child(gujarat) - india.add_child(karnataka) - - usa = TreeNode("USA") - - nj = TreeNode("New Jersey") - nj.add_child(TreeNode("Princeton")) - nj.add_child(TreeNode("Trenton")) - - california = TreeNode("California") - california.add_child(TreeNode("San Francisco")) - california.add_child(TreeNode("Mountain View")) - california.add_child(TreeNode("Palo Alto")) - - usa.add_child(nj) - usa.add_child(california) - - root.add_child(india) - root.add_child(usa) - - return root - - -if __name__ == '__main__': - root_node = build_location_tree() - root_node.print_tree(3) - - diff --git a/DataStructures/7_Tree/Exercise/management_hierarchy.py b/DataStructures/7_Tree/Exercise/management_hierarchy.py deleted file mode 100644 index 6c04821c..00000000 --- a/DataStructures/7_Tree/Exercise/management_hierarchy.py +++ /dev/null @@ -1,63 +0,0 @@ -class TreeNode: - def __init__(self, name, designation): - self.name = name - self.designation = designation - self.children = [] - self.parent = None - - def get_level(self): - level = 0 - p = self.parent - while p: - level += 1 - p = p.parent - - return level - - def print_tree(self, property_name): - if property_name == 'both': - value = self.name + " (" + self.designation + ")" - elif property_name == 'name': - value = self.name - else: - value = self.designation - - spaces = ' ' * self.get_level() * 3 - prefix = spaces + "|__" if self.parent else "" - print(prefix + value) - if self.children: - for child in self.children: - child.print_tree(property_name) - - def add_child(self, child): - child.parent = self - self.children.append(child) - -def build_management_tree(): - # CTO Hierarchy - infra_head = TreeNode("Vishwa","Infrastructure Head") - infra_head.add_child(TreeNode("Dhaval","Cloud Manager")) - infra_head.add_child(TreeNode("Abhijit", "App Manager")) - - cto = TreeNode("Chinmay", "CTO") - cto.add_child(infra_head) - cto.add_child(TreeNode("Aamir", "Application Head")) - - # HR hierarchy - hr_head = TreeNode("Gels","HR Head") - - hr_head.add_child(TreeNode("Peter","Recruitment Manager")) - hr_head.add_child(TreeNode("Waqas", "Policy Manager")) - - ceo = TreeNode("Nilupul", "CEO") - ceo.add_child(cto) - ceo.add_child(hr_head) - - return ceo - - -if __name__ == '__main__': - root_node = build_management_tree() - root_node.print_tree("name") - root_node.print_tree("designation") - root_node.print_tree("both") diff --git a/DataStructures/7_Tree/all_trees.png b/DataStructures/7_Tree/all_trees.png deleted file mode 100644 index be24ec3c88bb9a0ef181d19a6b0015cab56234e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36146 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 diff --git a/DataStructures/7_Tree/location_trees.png b/DataStructures/7_Tree/location_trees.png deleted file mode 100644 index 033175c918c0dd03601ddada9d4aa56948e59909..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25100 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 diff --git a/DataStructures/7_Tree/management_both.PNG b/DataStructures/7_Tree/management_both.PNG deleted file mode 100644 index f3658d6002c241d968ff95fe7dd4ba4b6b7d7964..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23277 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%0DtDu@$u2A# zWMp;TCXzvXm&|G};8!LJ_%!Fcm@e+$c$EyWeM#a~QU4*cG`LQEZ#k5)6(UzQUt`>! zPs^$84UTZ27^WRKV}nwG2@hWg)D6*%J182JjN62^`wXxK$Xr)@?xl;Av4c8a`gRAa z08S!^*Wf2d$Gxj|ZesV3xqoPRA68(e{kXNJA(+T)YM zO`R2|wbnnNG|Z&sHblpfJGIU{kHufHEOE+jz)bXTShUkOP1HtY*vuN3h-x?d8YXI; zwCqz&oVshv%df(I%_*fAP;HtoAN|tHky{cnt$x=G4#LO*`&%AV%PEgERb$tuHE^)< z#BDRs+n^!52-ZaCRFQJ770!v#7Pu`312_WeK+QP`3O?zSWLbPm3rk%_1j|-`%2qd- zXa;R)oAQS9r+n4gM_^;|sBRg!Z|WxRIs6xq(xfsBSD2ocUU0*4 z1iN=8KQ2n>k2o}g9;zG>s}|HLdi+1Pqr7|bzo@3c_ClW*#nd<;cq%sp3R*=Q5>>m5 zvbnr_dcL-N1GxA2_eP|&L69|;-=;1^-*lh2HZFg52n1UzMs$XijE#8g2+|e>>kSOp z=sblL18HudrHCRI_XHTlotXEG>YR0ofj@o(#8j>iI$vs?5AjS>=uiP@PD<{VeVlft zsHSPd$n>j~N4By1c&))XZV{Z?VVPFGB-gI2>wbwXADm(!dxhyn;;bTj8k6;zCYlS} zwLlDgT>c+YsF0%Pv^k?6s-kg5VAI;^6{<%KL)7YGjF(ddli3Z2C!ke z8iZ+ZV}L4^@<>l%D?)?+x(B1J-#qu@pRb}+KFZ>SK%|LvplU>~=rvx=<~}N@A|(Uv zB1v<0^(MJ;eEncM2<_%Dw>5P$Z@peI%HexJ+-sKBLe{F$9_+5K;<3-a%{8**8}1F@ ztOy~oXwe~0j{i+71!qh&2ZsVT)6ze3>E<>#xx)!_ap}$;#hxx~s9Osu5e@WFy8lfd zbzHehcF)WYh2S^DK+gJFpup_ZO`Dtu3bn)94~Mm%vv@;5!w{f%j&4u%cfeFi+ZJ-8 z*f~;t!S47>s!=p&jFmfUQ^8LJ2>i*9X7)IB8O!lqDeQq5U=d^!kXFn`SOBoR|A6H@ zo%AdS48pU|ZtISrx7a~J{;FjmR!~Kz{hIsQqRajrkqEq8N*x41CWS`ma$$O}K>abs zngct%6Qo#eS%abaa0aX-77$9vZA!|a8py%V>p)cuxoJ9KEl@`O3Yhqunt_QAFf?$M z0J$_~QCm>b^j_3ZeejA~6J}`$^I{R|x<*A}5$FVEgGHC1V>J;~Mg9GBe0cRiAhbKG>X;Pe#ewzce zPQ#cC(=ZrD8AVdkv(lHUXXe1V_`BN&4^XHRd|PyXIUU{&?QrBkq~UT+)ZV-6Rgr6aR`mr z8RU84XGP7BK`w}yq3}=&L!&*c!M1G(bB4y2sPH%1Q$Zuh7dkwn8IE7UK+BDOd`#j& z5*Y`U$;)rM^VTeAf4CqFB^$l+AA0JLeC*c`|JVdk1()-Y#ej@S9+6+{H}6!qBb{m% z^~=KfRNH~|%smdrnD1Ta;s8qKu_i2{qD?|pPXvxu%T}j?x+NKAQb$ClV(>t1$QEce z$=|?<7Ae%Z2K2b5O$!F9*HgU-mL#&*k{`Pg2ls}sa$!L5q6@f@_U6(1#rl__8BJun zU1UoVdE)k?CaQ>hU{ylhR8CZ zNE8}mjYsMv8cTTW`%)rXgoG@U!XSoFSqEh;L&i2E^Vk^`S?YX$>N)SZ-s^g=_gv>M znBO(b?|Xmm`*Yu~QXyd%+@ntfO(fAqw1+`|LtbQ5BiP!ZG&{TwX)>z6cgr8_8&Gp% zJ#>IR43*}hh|g`im9tiS<$yl>W)o4)2U*wpw83x1!@NMRsQrg$<5~>pW~Z*tm=lk) z-#J5sJwp;Y75>C_@4I>T(m_#`c@ylVZuSkufTc=F70XKZzT)KAU_TI3kT;Zgkx-)p z5Fg<#COmpQ!hQ(222}_5ft)VC_c)?}o68)C zQnel+2#?N+74z1yRi-OS1Kmh#eo+!;i>1kD1By zmSp#y;^Z@#elq3BopK8%QKBtB_zOUZEL>TrJXY>ey?A%BUreAIMe-Ynm65#xg54b} zY^Vmm>sPqaFUMXK2YiXzq!-ZWEqsy52j1F{59q0xY@B;~1Kedk`&%yJ^b?s3!LckE zj{1_yEforS)aqv1-=B72v(#x_FOw1Kw{^Fcj%5{m9Wv8_vp!@AOX#>jt}4Ft=A8{; zIcp~(822Ibo}|cULnf2Ruo#B)W2wGear%zMiL+ovCN{ti#H{*C3ntN8;GNBajTSX~ z4+KOmKxGoHdnu*Ck24&beH>hcoWb@+`dgT?-E~FKSEv12t0}wofIaC7&axvRK@WsE z*%Mvwl<7E30;#&4R`41kXf@pEg%-Fw7%I^zG0aMPic}Bu zvc=+xoaV1?)n+l@A7K@#G1SpIE;Q)rV6!{;Wyza;;)bgN)KA&7jN&=$F($e`v|PV# zEoR0{p2m)Mw;3M|#$mcaA@$e3ij>iRkahlAX!#!(O6#i6rVX~$dKgI9l0oSx{K~_P z^|ek!w&=9ed$*4HgG$lQWcg}L8zo*==cVArf&jBJZ#Kxe4T=(0R7B>4o8KS%pQq)GTczy2eY!r8-~vJxZWp(>Yv zST?X&q-Qx;bH`WJAoS@#Sokdys2px>aooL7h}pZyZAHWrZFcgxl)PR=$&mWCCL9*M zswSkg(l-eLY(|vRm;y+wfb<{AckDW$-LY)GP!4e|+3z7cR75skJ7>mG*K)UR1(?Fj zoh82v$3J@i0=Rb1U@Txf5}&u{T%fQ7AYGz!lIrsRL7JWgx*mvCW;5X0Vd(}$8~?Bc ze*lC6*ghNOnGy8KN|=q3==(mX54XxvpAEER7r0XAIoS!yM2V@xoaNO?e3My3v%{yP1;LIAA5+=EzuzWovyC~vn!9%dRFbYW}v|$ zpudX9Bx;h*vZ!{@$P5gaqF~A_X)^YvX(zzYau^OAB=XeTA@sZm72qM{%g{Fd_tpH( zl{^M&Z`sNnXoO?&=-v~TD;(@Gy;XZsG`o#y5l&ZM5$P1t4kGNl26JcuC3{d{W8|KM z^`JD9fQsQY`*Z;{K4Xb9FKVf#P+wTdcK-iho_(%5wqU5{hK1bu$4lOQr)9<>2w=ZX zssoLKesa=|QKAFWr>=k-v3d8Ffl(nE@8p`&(efh$B&eDsd%xV{5GmIyJ@Od}QL!n0 z(8deR70lOI;G;^9bB|2CouePLJ;K%bT zQ{G+ahn?#C3T6fdR|^?FbA&i+b^=@PIT-oaX#aN9r32V@)=0-jfBa5SKJ2;0d%uN5 zIwZdZw-MOh)^%MI?jK^Bcj8LD9bpO#86o(6 zc8AzmCsM(*NOxeTXE=4e91FpHQ9nT(Y%cIF8)YW!xJUQ-{yW`gT)vk=b9=oxR_r*8 z-Y3esZgJFhfu|>F!S|;>?m6yAV}Hw8MVuX2>+>}4(NAE3-3?1_Z`+PSO{uv#GfQsQ^A+9#Q$ zLa&0fZ_;`*a(L&OdWk?=?mEcP z-ak#_ra?P14_$(R`2eaF`dL1T?kfJ`BZeE90cH#?hVYQWn@m z|JC%TgCAPg%fpI zq0$qQRK~^0oWpBS%N!#$R`}(?p(an5h9rCks+TWD zo)FD=vVKt+>pgzH0M-v`>n2%Tl1Cl+biY|WWs$Xd7ftgUH$Ehj?6L*-0jbYR*{UULdl*GWLKnB z8~7C5Z-G5*#9R+QBfUSKrLTWH_`u0hp0yr6g&7b#^I4&O_JIwYA0Cs5U)c_1g;Sbyg!;%Q)5M%Z4!{rB)(f-S-Bce!ile5h&X&)wzv=-{9P8VP3Y0uB>hyW~7~cA)*(3wZe-gkKD+Sr=H2g{y zX-NP3kbM|@@fuK6DLUhwV^8+O=>TB@DZdf%R`eE_Q95^#jX~LIJkWZ6=W9b-ykf_D znw#8}o=$si?vEE9y|9MrI3LzG!#^5}>*wsiPGJITr$$6k_ivsSd%fANawPPkt_b(E zJEvD3+8k|q7&(ULqlQUc7hz!ZnEuh>oyz_%L9f-j&3|@J#0x?qJ|@B|$wzWvbM4BC zlM-DOFX90D6uvL4w4w9M4DB&q$aX_-%DtwNy|G|FMFpPU{;dfdc0h!8R!FoY9Dc7N zEU*&=-j;(`H`cz%TtnAJjPE!V2-2xaYmqEDOL~{4obs;Lf*3vn7D$nIclv|R-y;q+ zEVuhPN5OW2ry`kG-7vJi$y5iKwB2j~r-O6teAuL{mNuJKNKZjb9 zali(){ro#lzO#62n49!vZ1M+Y5TAVg`xv4|(|j1CAEJC&-dHiP_LYK!yomg*t+A%` z0~Xno2^R$T1TS&jN-iNC_uJMNBPBQ(5w0$qS%{OL@~DCBDQ>a088jLSGwR&=7q7ZN zv=5pCqZ%pAN_n(fP#wPDrVj6m2)QG%S{=PdRMJaVZ0(Rqe*(H%;!|ONi5WrzBk1`c zdyl2O{QK+UxPxVr7#a^(!`OZIx7{UJ;5jM&t_4R5ha&b;|Ub_Ob#&k*bon3H|+@%H9lQ=ReL zI8*n7lx!smOrtHJf=U<$m%4oSZvla^#Y}pUIUWMSf!1p~&HmaukFibO+7zQkKx(GN z28OWw`qecv*ZbaFr~10koMoPUV#N#t^==@DvxD7piQ@~dHF2U?aWe!*=v!OhRoCGR zI@YO{rHfP`4ro_-Shr>?-312?4n(hC!cUneNfcZ~X6)lMl(wiTj=)k(iq2Q^2bU>2 zt^ZY+l%N{RFzq&PCCs>J7SIft)nz&W>9~GmptAD#+|f18{Vi=WIAN5UJh3lIYBWe0 z3l8pI|KEq!X1}kSR&xey_TMgQ{Jwka-4JW5A?_w@QxcIVJ#pZ%!UWfAT55dq0^f`8 z;n0gRJDGOC+B+@Yipa{$e?c$#`Z?L@Cn8a_W!g22@);E4x+WJn#$f4SesTUCaBViW zF@J5zuh!u+khY_{m;5TEc!&ldryM%e#>%&yql;_(s+nJnB6Fl0Z@m3@Exy{U`63&d!`jefUN4AYx6N3U?UDq={$b~Zq}*v0 zS@Hb~59^ozuH)#UgzT;LQnlskp~(4zM8!EgOhXlS$YQceFa}slLDE52=gm6INzX2y zkI|LKAsxc!ZqJQL$E6BQyY~z4uIld&{rmkRy&D9(Ai7pCH$j&(u7mS8;iF+coL^KS zL~i=Yt7|P$%*RYP%?`dzPm?^u#a#820Vm7<_m$;RivE8AWB%_8%KusK*_)V*Xvh9Q Z^t&1s>(wkaf{E&VMh2$( self.data: - if self.right: - return self.right.search(val) - else: - return False - - def in_order_traversal(self): - elements = [] - if self.left: - elements += self.left.in_order_traversal() - - elements.append(self.data) - - if self.right: - elements += self.right.in_order_traversal() - - return elements - - def post_order_traversal(self): - elements = [] - if self.left: - elements += self.left.post_order_traversal() - if self.right: - elements += self.right.post_order_traversal() - - elements.append(self.data) - - return elements - - def pre_order_traversal(self): - elements = [self.data] - if self.left: - elements += self.left.pre_order_traversal() - if self.right: - elements += self.right.pre_order_traversal() - - return elements - - def find_max(self): - if self.right is None: - return self.data - return self.right.find_max() - - def find_min(self): - if self.left is None: - return self.data - return self.left.find_min() - - def calculate_sum(self): - left_sum = self.left.calculate_sum() if self.left else 0 - right_sum = self.right.calculate_sum() if self.right else 0 - return self.data + left_sum + right_sum - -def build_tree(elements): - root = BinarySearchTreeNode(elements[0]) - - for i in range(1,len(elements)): - root.add_child(elements[i]) - - return root - -if __name__ == '__main__': - numbers = [17, 4, 1, 20, 9, 23, 18, 34] - - numbers = [15,12,7,14,27,20,23,88 ] - - numbers_tree = build_tree(numbers) - print("Input numbers:",numbers) - print("Min:",numbers_tree.find_min()) - print("Max:",numbers_tree.find_max()) - print("Sum:", numbers_tree.calculate_sum()) - print("In order traversal:", numbers_tree.in_order_traversal()) - print("Pre order traversal:", numbers_tree.pre_order_traversal()) - print("Post order traversal:", numbers_tree.post_order_traversal()) \ No newline at end of file diff --git a/DataStructures/8_Binary_Tree_1/binary_tree_part_1.py b/DataStructures/8_Binary_Tree_1/binary_tree_part_1.py deleted file mode 100644 index 2c453a7d..00000000 --- a/DataStructures/8_Binary_Tree_1/binary_tree_part_1.py +++ /dev/null @@ -1,69 +0,0 @@ -class BinarySearchTreeNode: - def __init__(self, data): - self.data = data - self.left = None - self.right = None - - def add_child(self, data): - if data == self.data: - return # node already exist - - if data < self.data: - if self.left: - self.left.add_child(data) - else: - self.left = BinarySearchTreeNode(data) - else: - if self.right: - self.right.add_child(data) - else: - self.right = BinarySearchTreeNode(data) - - - def search(self, val): - if self.data == val: - return True - - if val < self.data: - if self.left: - return self.left.search(val) - else: - return False - - if val > self.data: - if self.right: - return self.right.search(val) - else: - return False - - def in_order_traversal(self): - elements = [] - if self.left: - elements += self.left.in_order_traversal() - - elements.append(self.data) - - if self.right: - elements += self.right.in_order_traversal() - - return elements - - -def build_tree(elements): - print("Building tree with these elements:",elements) - root = BinarySearchTreeNode(elements[0]) - - for i in range(1,len(elements)): - root.add_child(elements[i]) - - return root - -if __name__ == '__main__': - countries = ["India","Pakistan","Germany", "USA","China","India","UK","USA"] - country_tree = build_tree(countries) - - print("UK is in the list? ", country_tree.search("UK")) - print("Sweden is in the list? ", country_tree.search("Sweden")) - - numbers_tree = build_tree([17, 4, 1, 20, 9, 23, 18, 34]) - print("In order traversal gives this sorted list:",numbers_tree.in_order_traversal()) \ No newline at end of file diff --git a/DataStructures/9_Binary_Tree_2/9_binary_tree_part_2_exercise.md b/DataStructures/9_Binary_Tree_2/9_binary_tree_part_2_exercise.md deleted file mode 100644 index 6d837252..00000000 --- a/DataStructures/9_Binary_Tree_2/9_binary_tree_part_2_exercise.md +++ /dev/null @@ -1,28 +0,0 @@ -### Binary Tree Part 2 Exercise - -Modify delete method in class [BinarySearchTreeNode class](https://github.com/codebasics/py/tree/master/DataStructures/9_Binary_Tree_2/binary_tree_part_2.py) -to use min element from left subtree. You will remove lines marked with ---> and use max value from left subtree - -``` - def delete(self, val): - if val < self.data: - if self.left: - self.left = self.left.delete(val) - elif val > self.data: - if self.right: - self.right = self.right.delete(val) - else: - if self.left is None and self.right is None: - return None - elif self.left is None: - return self.right - elif self.right is None: - return self.right - - ---> min_val = self.right.find_min() - ---> self.data = min_val - ---> self.right = self.right.delete(min_val) -``` - -[Solution](https://github.com/codebasics/py/tree/master/DataStructures/9_Binary_Tree_2/Exercise/binary_tree_part_2_exercise.py) - diff --git a/DataStructures/9_Binary_Tree_2/Exercise/binary_tree_part_2_exercise.py b/DataStructures/9_Binary_Tree_2/Exercise/binary_tree_part_2_exercise.py deleted file mode 100644 index 6b2237c8..00000000 --- a/DataStructures/9_Binary_Tree_2/Exercise/binary_tree_part_2_exercise.py +++ /dev/null @@ -1,103 +0,0 @@ -class BinarySearchTreeNode: - def __init__(self, data): - self.data = data - self.left = None - self.right = None - - def add_child(self, data): - if data == self.data: - return # node already exist - - if data < self.data: - if self.left: - self.left.add_child(data) - else: - self.left = BinarySearchTreeNode(data) - else: - if self.right: - self.right.add_child(data) - else: - self.right = BinarySearchTreeNode(data) - - - def search(self, val): - if self.data == val: - return True - - if val < self.data: - if self.left: - return self.left.search(val) - else: - return False - - if val > self.data: - if self.right: - return self.right.search(val) - else: - return False - - def in_order_traversal(self): - elements = [] - if self.left: - elements += self.left.in_order_traversal() - - elements.append(self.data) - - if self.right: - elements += self.right.in_order_traversal() - - return elements - - def delete(self, val): - if val < self.data: - if self.left: - self.left = self.left.delete(val) - elif val > self.data: - if self.right: - self.right = self.right.delete(val) - else: - if self.left is None and self.right is None: - return None - elif self.left is None: - return self.right - elif self.right is None: - return self.right - - max_val = self.left.find_max() - self.data = max_val - self.left = self.left.delete(max_val) - - return self - - def find_max(self): - if self.right is None: - return self.data - return self.right.find_max() - - def find_min(self): - if self.left is None: - return self.data - return self.left.find_min() - - -def build_tree(elements): - print("Building tree with these elements:",elements) - root = BinarySearchTreeNode(elements[0]) - - for i in range(1,len(elements)): - root.add_child(elements[i]) - - return root - -if __name__ == '__main__': - numbers_tree = build_tree([17, 4, 1, 20, 9, 23, 18, 34]) - numbers_tree.delete(20) - print("After deleting 20 ",numbers_tree.in_order_traversal()) # this should print [1, 4, 9, 17, 18, 23, 34] - - numbers_tree = build_tree([17, 4, 1, 20, 9, 23, 18, 34]) - numbers_tree.delete(9) - print("After deleting 9 ",numbers_tree.in_order_traversal()) # this should print [1, 4, 17, 18, 20, 23, 34] - - numbers_tree = build_tree([17, 4, 1, 20, 9, 23, 18, 34]) - numbers_tree.delete(17) - print("After deleting 17 ",numbers_tree.in_order_traversal()) # this should print [1, 4, 9, 18, 20, 23, 34] diff --git a/DataStructures/9_Binary_Tree_2/binary_tree_part_2.py b/DataStructures/9_Binary_Tree_2/binary_tree_part_2.py deleted file mode 100644 index 8a4a4a5b..00000000 --- a/DataStructures/9_Binary_Tree_2/binary_tree_part_2.py +++ /dev/null @@ -1,103 +0,0 @@ -class BinarySearchTreeNode: - def __init__(self, data): - self.data = data - self.left = None - self.right = None - - def add_child(self, data): - if data == self.data: - return # node already exist - - if data < self.data: - if self.left: - self.left.add_child(data) - else: - self.left = BinarySearchTreeNode(data) - else: - if self.right: - self.right.add_child(data) - else: - self.right = BinarySearchTreeNode(data) - - - def search(self, val): - if self.data == val: - return True - - if val < self.data: - if self.left: - return self.left.search(val) - else: - return False - - if val > self.data: - if self.right: - return self.right.search(val) - else: - return False - - def in_order_traversal(self): - elements = [] - if self.left: - elements += self.left.in_order_traversal() - - elements.append(self.data) - - if self.right: - elements += self.right.in_order_traversal() - - return elements - - def delete(self, val): - if val < self.data: - if self.left: - self.left = self.left.delete(val) - elif val > self.data: - if self.right: - self.right = self.right.delete(val) - else: - if self.left is None and self.right is None: - return None - elif self.left is None: - return self.right - elif self.right is None: - return self.left - - min_val = self.right.find_min() - self.data = min_val - self.right = self.right.delete(min_val) - - return self - - def find_max(self): - if self.right is None: - return self.data - return self.right.find_max() - - def find_min(self): - if self.left is None: - return self.data - return self.left.find_min() - - -def build_tree(elements): - print("Building tree with these elements:",elements) - root = BinarySearchTreeNode(elements[0]) - - for i in range(1,len(elements)): - root.add_child(elements[i]) - - return root - -if __name__ == '__main__': - numbers_tree = build_tree([17, 4, 1, 20, 9, 23, 18, 34]) - numbers_tree.delete(20) - print("After deleting 20 ",numbers_tree.in_order_traversal()) # this should print [1, 4, 9, 17, 18, 23, 34] - - numbers_tree = build_tree([17, 4, 1, 20, 9, 23, 18, 34]) - numbers_tree.delete(9) - print("After deleting 9 ",numbers_tree.in_order_traversal()) # this should print [1, 4, 17, 18, 20, 23, 34] - - numbers_tree = build_tree([17, 4, 1, 20, 9, 23, 18, 34]) - numbers_tree.delete(17) - print("After deleting 17 ",numbers_tree.in_order_traversal()) # this should print [1, 4, 9, 18, 20, 23, 34] diff --git a/data-structures-algorithms-python b/data-structures-algorithms-python deleted file mode 160000 index fd76ee96..00000000 --- a/data-structures-algorithms-python +++ /dev/null @@ -1 +0,0 @@ -Subproject commit fd76ee96f7ca7a42ac1209ddba7dc49cd012c5d3 From fccd97ead6ee9aa53a9d6c9bec3b9f0f34ce29e6 Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 25 Jan 2021 16:19:00 +0530 Subject: [PATCH 08/39] fixed issues with 16 --- .../16_class_and_object_exercise.md | 22 +++++++++++++++ .../16_class_and_objects.py | 27 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 Basics/Hindi/16_class_and_objects/16_class_and_object_exercise.md create mode 100644 Basics/Hindi/16_class_and_objects/16_class_and_objects.py diff --git a/Basics/Hindi/16_class_and_objects/16_class_and_object_exercise.md b/Basics/Hindi/16_class_and_objects/16_class_and_object_exercise.md new file mode 100644 index 00000000..cf3883c4 --- /dev/null +++ b/Basics/Hindi/16_class_and_objects/16_class_and_object_exercise.md @@ -0,0 +1,22 @@ +## Exercise: Class and Objects + +1. Create a sample class named Employee with two attributes id and name + +``` +employee : + id + name +``` +object initializes id and name dynamically for every Employee object created. + +``` +emp = Employee(1, "coder") +``` + +2. Use del property to first delete id attribute and then the entire object + + +[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/16_class_and_objects/16_class_and_objects.py) + + + diff --git a/Basics/Hindi/16_class_and_objects/16_class_and_objects.py b/Basics/Hindi/16_class_and_objects/16_class_and_objects.py new file mode 100644 index 00000000..4893cabc --- /dev/null +++ b/Basics/Hindi/16_class_and_objects/16_class_and_objects.py @@ -0,0 +1,27 @@ +class Employee: + + def __init__(self, id, name): + self.id = id + self.name = name + + def display(self): + print(f"ID: {self.id} \nName: {self.name}") + + +# Creating a emp instance of Employee class +emp = Employee(1, "coder") + +emp.display() +# Deleting the property of object +del emp.id +# Deleting the object itself +try: + print(emp.id) +except NameError: + print("emp.id is not defined") + +del emp +try: + emp.display() # it will gives error after deleting emp +except NameError: + print("emp is not defined") \ No newline at end of file From 9e593c98319b5094cfcdc02acd6f908e9b145b6b Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 25 Jan 2021 16:22:22 +0530 Subject: [PATCH 09/39] changed - gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ff6d83fa..309c6a5a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ **/.idea/ .ipynb_checkpoints/ **/.ipynb_checkpoints/ -**/.cache/ \ No newline at end of file +**/.cache/ +.vscode \ No newline at end of file From 77c935591ac8d60654ee766e25135c8b0291a944 Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 25 Jan 2021 16:22:42 +0530 Subject: [PATCH 10/39] moved folder --- .../17_inheritance/inheritace.py | 0 .../17_inheritance/inheritance.md | 0 .../multiple_inheritance.md | 0 .../multiple_inheritance.py | 0 .../19_raise_exception_finally.md | 0 .../19_raise_exception_finally.py | 0 .../20_Iterators/20_Iterators.md | 0 .../20_Iterators/20_Iterators.py | 0 .../21_genrators/21_genrators.md | 0 .../21_genrators/21_genrators.py | 0 .../22_list_set_dict_comprehension.md | 0 .../22_list_set_dict_comprehension.py | 0 .../23_sets_frozensets/23_sets_frozensets.md | 0 .../23_sets_frozensets/23_sets_frozensets.py | 0 .../24_argparse/24_argparse.md | 0 .../24_argparse/24_argparse.py | 0 .../25_decorators/25_decorators.md | 0 .../25_decorators/25_decorators.py | 0 .../26_multithreading/26_multithreading.md | 0 .../26_multithreading/26_multithreading.py | 0 .../16_class_and_object_exercise.md | 26 ------------------- .../16_class_and_objects.py | 20 -------------- 22 files changed, 46 deletions(-) rename Basics/{python_basics => Hindi}/17_inheritance/inheritace.py (100%) rename Basics/{python_basics => Hindi}/17_inheritance/inheritance.md (100%) rename Basics/{python_basics => Hindi}/18_multiple_inheritance/multiple_inheritance.md (100%) rename Basics/{python_basics => Hindi}/18_multiple_inheritance/multiple_inheritance.py (100%) rename Basics/{python_basics => Hindi}/19_raise_exception_finally/19_raise_exception_finally.md (100%) rename Basics/{python_basics => Hindi}/19_raise_exception_finally/19_raise_exception_finally.py (100%) rename Basics/{python_basics => Hindi}/20_Iterators/20_Iterators.md (100%) rename Basics/{python_basics => Hindi}/20_Iterators/20_Iterators.py (100%) rename Basics/{python_basics => Hindi}/21_genrators/21_genrators.md (100%) rename Basics/{python_basics => Hindi}/21_genrators/21_genrators.py (100%) rename Basics/{python_basics => Hindi}/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md (100%) rename Basics/{python_basics => Hindi}/22_list_set_dict_comprehension/22_list_set_dict_comprehension.py (100%) rename Basics/{python_basics => Hindi}/23_sets_frozensets/23_sets_frozensets.md (100%) rename Basics/{python_basics => Hindi}/23_sets_frozensets/23_sets_frozensets.py (100%) rename Basics/{python_basics => Hindi}/24_argparse/24_argparse.md (100%) rename Basics/{python_basics => Hindi}/24_argparse/24_argparse.py (100%) rename Basics/{python_basics => Hindi}/25_decorators/25_decorators.md (100%) rename Basics/{python_basics => Hindi}/25_decorators/25_decorators.py (100%) rename Basics/{python_basics => Hindi}/26_multithreading/26_multithreading.md (100%) rename Basics/{python_basics => Hindi}/26_multithreading/26_multithreading.py (100%) delete mode 100644 Basics/python_basics/16_class_and_objects/16_class_and_object_exercise.md delete mode 100644 Basics/python_basics/16_class_and_objects/16_class_and_objects.py diff --git a/Basics/python_basics/17_inheritance/inheritace.py b/Basics/Hindi/17_inheritance/inheritace.py similarity index 100% rename from Basics/python_basics/17_inheritance/inheritace.py rename to Basics/Hindi/17_inheritance/inheritace.py diff --git a/Basics/python_basics/17_inheritance/inheritance.md b/Basics/Hindi/17_inheritance/inheritance.md similarity index 100% rename from Basics/python_basics/17_inheritance/inheritance.md rename to Basics/Hindi/17_inheritance/inheritance.md diff --git a/Basics/python_basics/18_multiple_inheritance/multiple_inheritance.md b/Basics/Hindi/18_multiple_inheritance/multiple_inheritance.md similarity index 100% rename from Basics/python_basics/18_multiple_inheritance/multiple_inheritance.md rename to Basics/Hindi/18_multiple_inheritance/multiple_inheritance.md diff --git a/Basics/python_basics/18_multiple_inheritance/multiple_inheritance.py b/Basics/Hindi/18_multiple_inheritance/multiple_inheritance.py similarity index 100% rename from Basics/python_basics/18_multiple_inheritance/multiple_inheritance.py rename to Basics/Hindi/18_multiple_inheritance/multiple_inheritance.py diff --git a/Basics/python_basics/19_raise_exception_finally/19_raise_exception_finally.md b/Basics/Hindi/19_raise_exception_finally/19_raise_exception_finally.md similarity index 100% rename from Basics/python_basics/19_raise_exception_finally/19_raise_exception_finally.md rename to Basics/Hindi/19_raise_exception_finally/19_raise_exception_finally.md diff --git a/Basics/python_basics/19_raise_exception_finally/19_raise_exception_finally.py b/Basics/Hindi/19_raise_exception_finally/19_raise_exception_finally.py similarity index 100% rename from Basics/python_basics/19_raise_exception_finally/19_raise_exception_finally.py rename to Basics/Hindi/19_raise_exception_finally/19_raise_exception_finally.py diff --git a/Basics/python_basics/20_Iterators/20_Iterators.md b/Basics/Hindi/20_Iterators/20_Iterators.md similarity index 100% rename from Basics/python_basics/20_Iterators/20_Iterators.md rename to Basics/Hindi/20_Iterators/20_Iterators.md diff --git a/Basics/python_basics/20_Iterators/20_Iterators.py b/Basics/Hindi/20_Iterators/20_Iterators.py similarity index 100% rename from Basics/python_basics/20_Iterators/20_Iterators.py rename to Basics/Hindi/20_Iterators/20_Iterators.py diff --git a/Basics/python_basics/21_genrators/21_genrators.md b/Basics/Hindi/21_genrators/21_genrators.md similarity index 100% rename from Basics/python_basics/21_genrators/21_genrators.md rename to Basics/Hindi/21_genrators/21_genrators.md diff --git a/Basics/python_basics/21_genrators/21_genrators.py b/Basics/Hindi/21_genrators/21_genrators.py similarity index 100% rename from Basics/python_basics/21_genrators/21_genrators.py rename to Basics/Hindi/21_genrators/21_genrators.py diff --git a/Basics/python_basics/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md b/Basics/Hindi/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md similarity index 100% rename from Basics/python_basics/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md rename to Basics/Hindi/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md diff --git a/Basics/python_basics/22_list_set_dict_comprehension/22_list_set_dict_comprehension.py b/Basics/Hindi/22_list_set_dict_comprehension/22_list_set_dict_comprehension.py similarity index 100% rename from Basics/python_basics/22_list_set_dict_comprehension/22_list_set_dict_comprehension.py rename to Basics/Hindi/22_list_set_dict_comprehension/22_list_set_dict_comprehension.py diff --git a/Basics/python_basics/23_sets_frozensets/23_sets_frozensets.md b/Basics/Hindi/23_sets_frozensets/23_sets_frozensets.md similarity index 100% rename from Basics/python_basics/23_sets_frozensets/23_sets_frozensets.md rename to Basics/Hindi/23_sets_frozensets/23_sets_frozensets.md diff --git a/Basics/python_basics/23_sets_frozensets/23_sets_frozensets.py b/Basics/Hindi/23_sets_frozensets/23_sets_frozensets.py similarity index 100% rename from Basics/python_basics/23_sets_frozensets/23_sets_frozensets.py rename to Basics/Hindi/23_sets_frozensets/23_sets_frozensets.py diff --git a/Basics/python_basics/24_argparse/24_argparse.md b/Basics/Hindi/24_argparse/24_argparse.md similarity index 100% rename from Basics/python_basics/24_argparse/24_argparse.md rename to Basics/Hindi/24_argparse/24_argparse.md diff --git a/Basics/python_basics/24_argparse/24_argparse.py b/Basics/Hindi/24_argparse/24_argparse.py similarity index 100% rename from Basics/python_basics/24_argparse/24_argparse.py rename to Basics/Hindi/24_argparse/24_argparse.py diff --git a/Basics/python_basics/25_decorators/25_decorators.md b/Basics/Hindi/25_decorators/25_decorators.md similarity index 100% rename from Basics/python_basics/25_decorators/25_decorators.md rename to Basics/Hindi/25_decorators/25_decorators.md diff --git a/Basics/python_basics/25_decorators/25_decorators.py b/Basics/Hindi/25_decorators/25_decorators.py similarity index 100% rename from Basics/python_basics/25_decorators/25_decorators.py rename to Basics/Hindi/25_decorators/25_decorators.py diff --git a/Basics/python_basics/26_multithreading/26_multithreading.md b/Basics/Hindi/26_multithreading/26_multithreading.md similarity index 100% rename from Basics/python_basics/26_multithreading/26_multithreading.md rename to Basics/Hindi/26_multithreading/26_multithreading.md diff --git a/Basics/python_basics/26_multithreading/26_multithreading.py b/Basics/Hindi/26_multithreading/26_multithreading.py similarity index 100% rename from Basics/python_basics/26_multithreading/26_multithreading.py rename to Basics/Hindi/26_multithreading/26_multithreading.py diff --git a/Basics/python_basics/16_class_and_objects/16_class_and_object_exercise.md b/Basics/python_basics/16_class_and_objects/16_class_and_object_exercise.md deleted file mode 100644 index 52d5d054..00000000 --- a/Basics/python_basics/16_class_and_objects/16_class_and_object_exercise.md +++ /dev/null @@ -1,26 +0,0 @@ -## Exercise: Class and Objects - -1. Create a sample class named Employee with two attributes id and name - - -``` -employee : - id - name - --> such that object initializes id and name dynamically for every employees -``` - -2. Use del property on attributes as well as class objects - -``` -emp = Employee(1,"coder") - -use : del emp.id -use : del emp -``` - -[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/16_class_and_objects/16_class_and_objects.py) - - - diff --git a/Basics/python_basics/16_class_and_objects/16_class_and_objects.py b/Basics/python_basics/16_class_and_objects/16_class_and_objects.py deleted file mode 100644 index 7c1120fa..00000000 --- a/Basics/python_basics/16_class_and_objects/16_class_and_objects.py +++ /dev/null @@ -1,20 +0,0 @@ -class Employee: - - def __init__(self,id,name): - self.id=id - self.name=name - - def display(self): - print("ID: %d \nName: %s" % (self.id, self.name)) - -# Creating a emp instance of Employee class -emp = Employee(1,"coder") - -# Deleting the property of object -# del emp.id -# Deleting the object itself -emp.display() - - -#del emp -#emp.display() #it will gives error after del emp \ No newline at end of file From 21c8ae92382a83c57cf774d56a1bc45ef3b0cb72 Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 25 Jan 2021 16:51:27 +0530 Subject: [PATCH 11/39] changed - changed exercise --- .../19_raise_exception_finally.md | 9 ++-- .../19_raise_exception_finally.py | 42 +++++++++++++------ 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/Basics/Hindi/19_raise_exception_finally/19_raise_exception_finally.md b/Basics/Hindi/19_raise_exception_finally/19_raise_exception_finally.md index 78a4908d..da42cfea 100644 --- a/Basics/Hindi/19_raise_exception_finally/19_raise_exception_finally.md +++ b/Basics/Hindi/19_raise_exception_finally/19_raise_exception_finally.md @@ -1,13 +1,12 @@ ## Exercise: Raise Exception And Finally -1. Create Any Custom Exception and raise it. +1. Create a custom exception AdultException. -``` - for creating custom exception just create a subClass of Exception. -``` +2. Create a class Person with attributes name and age in it. -2.now raise that custom Exception +3. Create a function get_minor_age() in the class. It throws an exception if the person is adult otherwise returns age. +4. Create a function display_person() which prints the age and name of a person. ``` let us say, diff --git a/Basics/Hindi/19_raise_exception_finally/19_raise_exception_finally.py b/Basics/Hindi/19_raise_exception_finally/19_raise_exception_finally.py index f1b8507c..317047d2 100644 --- a/Basics/Hindi/19_raise_exception_finally/19_raise_exception_finally.py +++ b/Basics/Hindi/19_raise_exception_finally/19_raise_exception_finally.py @@ -1,14 +1,30 @@ # for making exception just make subclass of Exception -class isMajor(Exception): - pass - -def check(age): - if int(age) < 18: - raise isMajor - else: - print('Age: '+str(age)) - -#don't raise -check(23) -#raises an Exception -check(17) \ No newline at end of file +class AdultException(Exception): + pass + + +class Person: + def __init__(self, name, age): + self.name = name + self.age = age + + def get_minor_age(self): + if int(self.age) >= 18: + raise AdultException + else: + return self.age + + def display(self): + try: + print(f"age -> {self.get_minor_age()}") + except AdultException: + print("Person is an adult") + finally: + print(f"name -> {self.name}") + + +# No exception +Person("Bhavin", 17).display() + +# AdultException is raised +Person("Dhaval", 23).display() From 3648cf2ae8b24d27d608d4892324efedc3472229 Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 25 Jan 2021 16:57:36 +0530 Subject: [PATCH 12/39] added - limit the stopping condition for iterator --- Basics/Hindi/20_Iterators/20_Iterators.md | 10 ++-------- Basics/Hindi/20_Iterators/20_Iterators.py | 22 +++++++++++----------- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/Basics/Hindi/20_Iterators/20_Iterators.md b/Basics/Hindi/20_Iterators/20_Iterators.md index 2bf2bab0..100ca74f 100644 --- a/Basics/Hindi/20_Iterators/20_Iterators.md +++ b/Basics/Hindi/20_Iterators/20_Iterators.md @@ -1,13 +1,7 @@ ## Exercise: Iterators -1. create iterator for fibonacci series. - - -``` -Explanation : - iterator must be initialized such that each of next returns next fibonacci number - -``` +1. Create an iterator for fibonacci series in such a way that each next returns the next element from fibonacci series. +2. The iterator should stop when it reaches a `limit` defined in the constructor. diff --git a/Basics/Hindi/20_Iterators/20_Iterators.py b/Basics/Hindi/20_Iterators/20_Iterators.py index 4a2f21ba..5caa6a57 100644 --- a/Basics/Hindi/20_Iterators/20_Iterators.py +++ b/Basics/Hindi/20_Iterators/20_Iterators.py @@ -1,30 +1,30 @@ -class fibonacci: - def __init__(self): +class Fibonacci: + def __init__(self, limit): # default constructor self.previous = 0 self.current = 1 self.n = 1 + self.limit = limit - def __iter__(self): + def __iter__(self): return self - def __next__(self): - if self.n < 5: + def __next__(self): + if self.n < self.limit: result = self.previous + self.current self.previous = self.current self.current = result self.n += 1 return result else: - raise StopIteration + raise StopIteration + # init the fib_iterator -fib_iterator = iter(fibonacci()) +fib_iterator = iter(Fibonacci(5)) while True: - # print the value of next fibonaccinacci up to 5th fibonaccinacci + # print the value of next fibonacci up to 5th fibonacci try: print(next(fib_iterator)) except StopIteration: - break - - + break From 8d2e7c988dfbc7f7c749b51ac1dc59f9767beb5b Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 25 Jan 2021 17:19:19 +0530 Subject: [PATCH 13/39] added - list and set dicts --- .../22_list_set_dict_comprehension.md | 29 ++++++++++++------- .../22_list_set_dict_comprehension.py | 22 ++++++++++---- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/Basics/Hindi/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md b/Basics/Hindi/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md index c82fd48f..dbbebc37 100644 --- a/Basics/Hindi/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md +++ b/Basics/Hindi/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md @@ -1,24 +1,33 @@ ## Exercise: Generators -1. list1=create a list of integers - list2=create a list of strings of binary values of list1 +1. Create a Dictionary which contains the Binary values mapping with numbers found in the below integer and binary and save it in binary_dict. +Example : ``` - example : - num=[0,1,2,3,4] - binary=["0","1","10","11","100"] + integer = [0, 1, 2, 3, 4] + binary = ["0", "1", "10", "11", "100"] + binary_dict = {0:"0", 1:"1", 2:"10", 3: "11", 4:"100"} ``` -2. Create a Dictionary of Binary values mapping with integers using Zip - +2. Create a List which contains additive inverse of a given integer list. +An additive inverse `a` for an integer `i` is a number such that: +``` +a + i = 0 +``` +Example: +``` +integer = [1, -1, 2, 3, 5, 0, -7] +additive_inverse = [-1, 1, -2, -3, -5, 0, 7] +``` +3. Create a set which only contains unique sqaures from a given a integer list. ``` - example : - dict={0:"0",1:"1",2:"10" ......} - +integer = [1, -1, 2, -2, 3, -3] +sq_set = {1, 4, 9} ``` + [Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/22_list_set_dict_comprehension/22_list_set_dict_comprehension.py) diff --git a/Basics/Hindi/22_list_set_dict_comprehension/22_list_set_dict_comprehension.py b/Basics/Hindi/22_list_set_dict_comprehension/22_list_set_dict_comprehension.py index 718d7e7e..7fcb3547 100644 --- a/Basics/Hindi/22_list_set_dict_comprehension/22_list_set_dict_comprehension.py +++ b/Basics/Hindi/22_list_set_dict_comprehension/22_list_set_dict_comprehension.py @@ -1,6 +1,18 @@ -num=[0,1,2,3,4] -binary=["0","1","10","11","100"] +# Dictionary +integer = [0, 1, 2, 3, 4] +binary = ["0", "1", "10", "11", "100"] -z=zip(num,binary) -ans={num:binary for num,binary in z} -print(ans) \ No newline at end of file +z = zip(integer, binary) +binary_dict = {integer: binary for integer, binary in z} + +print(binary_dict) + +# List +integer = [1, -1, 2, 3, 5, 0, -7] +additive_inverse = [-1*i for i in integer] +print(additive_inverse) + +# Set +integer = [1, -1, 2, -2, 3, -3] +sq_set = {i*i for i in integer} +print(sq_set) From a6a67718fbfc0171d92751db90be5bcbfef3e8dc Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 25 Jan 2021 17:20:21 +0530 Subject: [PATCH 14/39] renamed --- .../21_generators.md} | 0 Basics/Hindi/21_generators/21_generators.py | 11 +++++++++++ Basics/Hindi/21_genrators/21_genrators.py | 9 --------- 3 files changed, 11 insertions(+), 9 deletions(-) rename Basics/Hindi/{21_genrators/21_genrators.md => 21_generators/21_generators.md} (100%) create mode 100644 Basics/Hindi/21_generators/21_generators.py delete mode 100644 Basics/Hindi/21_genrators/21_genrators.py diff --git a/Basics/Hindi/21_genrators/21_genrators.md b/Basics/Hindi/21_generators/21_generators.md similarity index 100% rename from Basics/Hindi/21_genrators/21_genrators.md rename to Basics/Hindi/21_generators/21_generators.md diff --git a/Basics/Hindi/21_generators/21_generators.py b/Basics/Hindi/21_generators/21_generators.py new file mode 100644 index 00000000..699ec2b7 --- /dev/null +++ b/Basics/Hindi/21_generators/21_generators.py @@ -0,0 +1,11 @@ +def next_square(): + i = 1 + while True: + yield i * i + i += 1 + + +for n in next_square(): + if n > 25: + break + print(n) diff --git a/Basics/Hindi/21_genrators/21_genrators.py b/Basics/Hindi/21_genrators/21_genrators.py deleted file mode 100644 index 3fb02201..00000000 --- a/Basics/Hindi/21_genrators/21_genrators.py +++ /dev/null @@ -1,9 +0,0 @@ -def next_square(): - i=1 - while True: - yield i*i - i+=1 -for n in next_square(): - if n>25: - break - print(n) \ No newline at end of file From 65a6b504691351f7a4dac6844203fe0f2ef9547d Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 25 Jan 2021 17:23:08 +0530 Subject: [PATCH 15/39] formatted --- Basics/Hindi/23_sets_frozensets/23_sets_frozensets.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Basics/Hindi/23_sets_frozensets/23_sets_frozensets.py b/Basics/Hindi/23_sets_frozensets/23_sets_frozensets.py index e3dd51b1..9b7567e7 100644 --- a/Basics/Hindi/23_sets_frozensets/23_sets_frozensets.py +++ b/Basics/Hindi/23_sets_frozensets/23_sets_frozensets.py @@ -1,5 +1,5 @@ -set1 = {1,2,3,4,5} -set2 = {4,5,6,7,8} +set1 = {1, 2, 3, 4, 5} +set2 = {4, 5, 6, 7, 8} print("Original sets:") print(set1) print(set2) @@ -8,6 +8,6 @@ print("Difference of set2 and set1 using difference():") print(set2.difference(set1)) print("Difference of set1 and set2 using - operator:") -print(set1-set2) +print(set1 - set2) print("Difference of set2 and set1 using - operator:") -print(set2-set1) \ No newline at end of file +print(set2 - set1) From 87741e1292b00933d604236ad54f8b8c5a0c7502 Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 25 Jan 2021 17:23:19 +0530 Subject: [PATCH 16/39] formatted --- Basics/Hindi/24_argparse/24_argparse.md | 10 +--------- Basics/Hindi/24_argparse/24_argparse.py | 9 ++++----- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/Basics/Hindi/24_argparse/24_argparse.md b/Basics/Hindi/24_argparse/24_argparse.md index 9fed9a12..45b66c09 100644 --- a/Basics/Hindi/24_argparse/24_argparse.md +++ b/Basics/Hindi/24_argparse/24_argparse.md @@ -7,15 +7,7 @@ example: python3 cmd.py --physics 60 --chemistry 70 --maths 90 ``` -2. find PCM(physics chemistry maths) Merit(Average) using command line input of marks - -``` - -take input - -do sum of marks - -take average - -``` - +2. Find average marks for the three subjects using command line input of marks. [Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/24_argparse/24_argparse.py) diff --git a/Basics/Hindi/24_argparse/24_argparse.py b/Basics/Hindi/24_argparse/24_argparse.py index fe0c2d92..f35d7790 100644 --- a/Basics/Hindi/24_argparse/24_argparse.py +++ b/Basics/Hindi/24_argparse/24_argparse.py @@ -12,9 +12,8 @@ print(args.chemistry) print(args.maths) - + print("Result:", ( + int(args.physics) + int(args.chemistry) + int(args.maths) + ) / 3) - print("Result:",(int(args.physics)+int(args.chemistry)+int(args.maths))/3) - - - #python3 cmd.py --physics 60 --chemistry 70 --maths 90 + # python3 cmd.py --physics 60 --chemistry 70 --maths 90 From d3229fb68ccb78911140b767a438707346627520 Mon Sep 17 00:00:00 2001 From: d_p_beladiya Date: Mon, 25 Jan 2021 17:25:43 +0530 Subject: [PATCH 17/39] Edited: 17_18 --- .../17_inheritance/inheritace.py | 21 +++++++------- .../17_inheritance/inheritance.md | 10 +++---- .../multiple_inheritance.md | 14 ++++++++-- .../multiple_inheritance.py | 28 +++++++++---------- 4 files changed, 40 insertions(+), 33 deletions(-) diff --git a/Basics/python_basics/17_inheritance/inheritace.py b/Basics/python_basics/17_inheritance/inheritace.py index 6eece8db..a90123c8 100644 --- a/Basics/python_basics/17_inheritance/inheritace.py +++ b/Basics/python_basics/17_inheritance/inheritace.py @@ -1,15 +1,14 @@ -class Father: - def __init__(self, name, lastname): - self.name = name - self.lastname = lastname +class Animal: + def __init__(self, living_place): + self.living_place = living_place - def printname(self): - print(self.name, self.lastname) + def printplace(self): + print(self.living_place) -class Son(Father): - def __init__(self, name, lastname): - super().__init__(name, lastname) +class Dog(Animal): + def __init__(self, living_place): + super().__init__(living_place) -x = Son("Darshan", "Beladiya") -x.printname() +x = Dog("zoo") +x.printplace() diff --git a/Basics/python_basics/17_inheritance/inheritance.md b/Basics/python_basics/17_inheritance/inheritance.md index 79505d97..c8f2fd8c 100644 --- a/Basics/python_basics/17_inheritance/inheritance.md +++ b/Basics/python_basics/17_inheritance/inheritance.md @@ -1,21 +1,21 @@ ## Exercise: Inheritance -1. create inheritance using father son relation on printname. +1. create inheritance using animal dog relation. ``` for example, - father and son both has name so create a method for printname by passing firstname and lastname + animal and dog both has same living_place so create a method for living_place ``` 2. use super() constructor for calling parent constructor. ``` -class father: +class animal: #code -class son(father): - super()-it refers father class,now you can call father's methods. +class dog(animal): + super()-it refers animal class,now you can call animal's methods. ``` [Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/17_inheritance/17_inheritance.py) diff --git a/Basics/python_basics/18_multiple_inheritance/multiple_inheritance.md b/Basics/python_basics/18_multiple_inheritance/multiple_inheritance.md index b2db45c1..46f2c3ea 100644 --- a/Basics/python_basics/18_multiple_inheritance/multiple_inheritance.md +++ b/Basics/python_basics/18_multiple_inheritance/multiple_inheritance.md @@ -1,13 +1,21 @@ ## Exercise: Multiple Inheritance Real Life Example : -1. Create multiple inheritance in mario game +1. Create multiple inheritance on teacher,student and youtuber. ``` -Q. if we have created Mario Game with only move module and now we wants to add jump as well as eat then what??? +Q. if we have created teacher and now one student joins master degree with becoming teacher then what?? + +Ans : just make subclass from teacher so that student will become teacher +``` + +2. Now student is teacher as well as youtuber then what??? + + +``` +-just use multiple inheritance for these three relations -Ans : just make subclass from mario and add extra methods so that we will be having expanded class. ``` diff --git a/Basics/python_basics/18_multiple_inheritance/multiple_inheritance.py b/Basics/python_basics/18_multiple_inheritance/multiple_inheritance.py index 5e16308c..5b7ac964 100644 --- a/Basics/python_basics/18_multiple_inheritance/multiple_inheritance.py +++ b/Basics/python_basics/18_multiple_inheritance/multiple_inheritance.py @@ -1,20 +1,20 @@ -class superMario(): - def move(self): - print('I am moving') +class Teacher(): + def teachers_action(self): + print('I can teach') -class jump(): - def jump_above(self): - print('I just jumped') +class Engineer(): + def Engineers_action(self): + print('I can code') -class mushroom(): - def eat_mushroom(self): - print('I have become big now') +class Youtuber(): + def youtubers_action(self): + print('I can code and teach') -class Mario(superMario, mushroom, jump): +class Person(Teacher, Engineer, Youtuber): pass -play = Mario() -play.move() -play.eat_mushroom() -play.jump_above() \ No newline at end of file +coder = Person() +coder.teachers_action() +coder.Engineers_action() +coder.youtubers_action() From fb9940b5b7978d9d74e88655a36d3408f3b0a982 Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 25 Jan 2021 17:31:41 +0530 Subject: [PATCH 18/39] formatted --- Basics/Hindi/25_decorators/25_decorators.md | 16 +++++--------- Basics/Hindi/25_decorators/25_decorators.py | 23 +++++++++++++++------ 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/Basics/Hindi/25_decorators/25_decorators.md b/Basics/Hindi/25_decorators/25_decorators.md index 37bb35fe..d11c387c 100644 --- a/Basics/Hindi/25_decorators/25_decorators.md +++ b/Basics/Hindi/25_decorators/25_decorators.md @@ -1,22 +1,16 @@ ## Exercise: Decorators -1. Create decorator function to check that the argument passed to the function factorial is a positive integer: +1. Create a decorator function to check that the argument passed to the function factorial is a non-negative integer: -``` -example: - - factorial(-1) : raise Exception or print error message +2. Create a factorial function which finds the factorial of a number. - -``` - - -2. Also check that number is integer or not +3. Use the decorator to decorate the factorial function to only allow factorial of non-negative integers. ``` example: factorial(1.354) : raise Exception or print error message + factorial(-1) : raise Exception or print error message + factorial(5) : 60 - ``` [Solution](https://github.com/codebasics/py/blob/master/Basics/python_basicsHindi/25_decorators/25_decorators.py) diff --git a/Basics/Hindi/25_decorators/25_decorators.py b/Basics/Hindi/25_decorators/25_decorators.py index f0482093..ad5dbe58 100644 --- a/Basics/Hindi/25_decorators/25_decorators.py +++ b/Basics/Hindi/25_decorators/25_decorators.py @@ -3,17 +3,28 @@ def helper(x): if type(x) == int and x > 0: return f(x) else: - raise Exception("Argument is not an integer") + raise Exception("Argument is not a non-negative integer") + return helper - + + @check def factorial(n): if n == 1: return 1 else: - return n * factorial(n-1) + return n * factorial(n - 1) + + +for i in range(1, 10): + print(i, factorial(i)) -for i in range(1,10): - print(i, factorial(i)) +try: + print(factorial(-1)) +except Exception as e: + e.print_exception() -print(factorial(-1)) \ No newline at end of file +try: + print(factorial(1.354)) +except Exception as e: + e.print_exception() \ No newline at end of file From 9b9a5897c09c85ba7b2a11935d55f805dbba5119 Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 25 Jan 2021 17:38:13 +0530 Subject: [PATCH 19/39] formatted --- Basics/Hindi/17_inheritance/inheritace.py | 24 ++++++++++++------- Basics/Hindi/17_inheritance/inheritance.md | 10 ++++---- .../multiple_inheritance.py | 23 ++++++++++-------- 3 files changed, 34 insertions(+), 23 deletions(-) diff --git a/Basics/Hindi/17_inheritance/inheritace.py b/Basics/Hindi/17_inheritance/inheritace.py index a90123c8..d64efa1e 100644 --- a/Basics/Hindi/17_inheritance/inheritace.py +++ b/Basics/Hindi/17_inheritance/inheritace.py @@ -1,14 +1,22 @@ class Animal: - def __init__(self, living_place): - self.living_place = living_place + def __init__(self, habitat): + self.habitat = habitat + + def print_habitat(self): + print(self.habitat) + + def sound(self): + print("Some Animal Sound") - def printplace(self): - print(self.living_place) class Dog(Animal): - def __init__(self, living_place): - super().__init__(living_place) + def __init__(self): + super().__init__("Kennel") + + def sound(self): + print("Woof woof!") -x = Dog("zoo") -x.printplace() +x = Dog() +x.print_habitat() +x.sound() \ No newline at end of file diff --git a/Basics/Hindi/17_inheritance/inheritance.md b/Basics/Hindi/17_inheritance/inheritance.md index c8f2fd8c..925e0945 100644 --- a/Basics/Hindi/17_inheritance/inheritance.md +++ b/Basics/Hindi/17_inheritance/inheritance.md @@ -1,21 +1,21 @@ ## Exercise: Inheritance -1. create inheritance using animal dog relation. +1. create inheritance using animal Dog relation. ``` for example, - animal and dog both has same living_place so create a method for living_place + Animal and Dog both has same habitat so create a method for habitat ``` 2. use super() constructor for calling parent constructor. ``` -class animal: +class Animal: #code -class dog(animal): - super()-it refers animal class,now you can call animal's methods. +class Dog(Animal): + super()-it refers Animal class,now you can call Animal's methods. ``` [Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/17_inheritance/17_inheritance.py) diff --git a/Basics/Hindi/18_multiple_inheritance/multiple_inheritance.py b/Basics/Hindi/18_multiple_inheritance/multiple_inheritance.py index 5b7ac964..57be8094 100644 --- a/Basics/Hindi/18_multiple_inheritance/multiple_inheritance.py +++ b/Basics/Hindi/18_multiple_inheritance/multiple_inheritance.py @@ -1,20 +1,23 @@ -class Teacher(): - def teachers_action(self): - print('I can teach') +class Teacher: + def teachers_action(self): + print("I can teach") -class Engineer(): +class Engineer: def Engineers_action(self): - print('I can code') + print("I can code") -class Youtuber(): + +class Youtuber: def youtubers_action(self): - print('I can code and teach') + print("I can code and teach") + + +class Person(Teacher, Engineer, Youtuber): + pass -class Person(Teacher, Engineer, Youtuber): - pass -coder = Person() +coder = Person() coder.teachers_action() coder.Engineers_action() coder.youtubers_action() From 2367fcbd76140895285a35f79fe4255e479d7eb9 Mon Sep 17 00:00:00 2001 From: Karandeep Singh Grover <30365139+groverkds@users.noreply.github.com> Date: Tue, 26 Jan 2021 09:58:28 +0530 Subject: [PATCH 20/39] Rename inheritace.py to inheritance.py --- Basics/Hindi/17_inheritance/{inheritace.py => inheritance.py} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename Basics/Hindi/17_inheritance/{inheritace.py => inheritance.py} (97%) diff --git a/Basics/Hindi/17_inheritance/inheritace.py b/Basics/Hindi/17_inheritance/inheritance.py similarity index 97% rename from Basics/Hindi/17_inheritance/inheritace.py rename to Basics/Hindi/17_inheritance/inheritance.py index d64efa1e..b9c860db 100644 --- a/Basics/Hindi/17_inheritance/inheritace.py +++ b/Basics/Hindi/17_inheritance/inheritance.py @@ -19,4 +19,4 @@ def sound(self): x = Dog() x.print_habitat() -x.sound() \ No newline at end of file +x.sound() From 73e55beedfc871dfed4bdef3623692efdda20848 Mon Sep 17 00:00:00 2001 From: Karandeep Singh Grover <30365139+groverkds@users.noreply.github.com> Date: Tue, 26 Jan 2021 09:58:52 +0530 Subject: [PATCH 21/39] Rename inheritance.py to 17_inheritance.py --- Basics/Hindi/17_inheritance/{inheritance.py => 17_inheritance.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Basics/Hindi/17_inheritance/{inheritance.py => 17_inheritance.py} (100%) diff --git a/Basics/Hindi/17_inheritance/inheritance.py b/Basics/Hindi/17_inheritance/17_inheritance.py similarity index 100% rename from Basics/Hindi/17_inheritance/inheritance.py rename to Basics/Hindi/17_inheritance/17_inheritance.py From 4340f72dcfe6290024d959144bc955091ccd2871 Mon Sep 17 00:00:00 2001 From: Karandeep Singh Grover <30365139+groverkds@users.noreply.github.com> Date: Tue, 26 Jan 2021 09:59:06 +0530 Subject: [PATCH 22/39] Rename multiple_inheritance.md to 18_multiple_inheritance.md --- .../{multiple_inheritance.md => 18_multiple_inheritance.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Basics/Hindi/18_multiple_inheritance/{multiple_inheritance.md => 18_multiple_inheritance.md} (100%) diff --git a/Basics/Hindi/18_multiple_inheritance/multiple_inheritance.md b/Basics/Hindi/18_multiple_inheritance/18_multiple_inheritance.md similarity index 100% rename from Basics/Hindi/18_multiple_inheritance/multiple_inheritance.md rename to Basics/Hindi/18_multiple_inheritance/18_multiple_inheritance.md From 3eca98bd01aa0fce2b6611f1e14eac2c9a8c1b01 Mon Sep 17 00:00:00 2001 From: Karandeep Singh Grover <30365139+groverkds@users.noreply.github.com> Date: Tue, 26 Jan 2021 09:59:53 +0530 Subject: [PATCH 23/39] Rename multiple_inheritance.py to 18_multiple_inheritance.py --- .../{multiple_inheritance.py => 18_multiple_inheritance.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Basics/Hindi/18_multiple_inheritance/{multiple_inheritance.py => 18_multiple_inheritance.py} (100%) diff --git a/Basics/Hindi/18_multiple_inheritance/multiple_inheritance.py b/Basics/Hindi/18_multiple_inheritance/18_multiple_inheritance.py similarity index 100% rename from Basics/Hindi/18_multiple_inheritance/multiple_inheritance.py rename to Basics/Hindi/18_multiple_inheritance/18_multiple_inheritance.py From a841369c534f3c852c408393c0dc4e4c5d266d7a Mon Sep 17 00:00:00 2001 From: Karandeep Singh Grover <30365139+groverkds@users.noreply.github.com> Date: Tue, 26 Jan 2021 10:00:26 +0530 Subject: [PATCH 24/39] Rename inheritance.md to 17_inheritance.md --- Basics/Hindi/17_inheritance/{inheritance.md => 17_inheritance.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Basics/Hindi/17_inheritance/{inheritance.md => 17_inheritance.md} (100%) diff --git a/Basics/Hindi/17_inheritance/inheritance.md b/Basics/Hindi/17_inheritance/17_inheritance.md similarity index 100% rename from Basics/Hindi/17_inheritance/inheritance.md rename to Basics/Hindi/17_inheritance/17_inheritance.md From e1bd873868906f0e6cc7c3bf51799c0bdad6c3c5 Mon Sep 17 00:00:00 2001 From: dhavalsays <60363945+dhavalsays@users.noreply.github.com> Date: Sat, 30 Jan 2021 10:40:07 -0500 Subject: [PATCH 25/39] Update data_analyst_learning_path_2020.md --- .../DataAnalystRoadMap2020/data_analyst_learning_path_2020.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TechTopics/DataAnalystRoadMap2020/data_analyst_learning_path_2020.md b/TechTopics/DataAnalystRoadMap2020/data_analyst_learning_path_2020.md index d0735c4c..8296e232 100644 --- a/TechTopics/DataAnalystRoadMap2020/data_analyst_learning_path_2020.md +++ b/TechTopics/DataAnalystRoadMap2020/data_analyst_learning_path_2020.md @@ -27,6 +27,7 @@ Following is a schedule to learn data science step by step considering **4 hours * Power BI (project) - codebasics sales insights project: https://www.youtube.com/playlist?list=PLeo1K3hjS3uva8pk1FI3iK9kCOKQdz1I9 + - personal finance project: https://www.youtube.com/watch?v=pqSoCa2NGj4 ### Week 6 and 7: Python From e26c3fef5c1b99cd8c915c413fba1cb3c6676b6b Mon Sep 17 00:00:00 2001 From: dhavalsays <60363945+dhavalsays@users.noreply.github.com> Date: Sat, 30 Jan 2021 10:41:04 -0500 Subject: [PATCH 26/39] Update data_science_roadmap_2020.md --- TechTopics/DataScienceRoadMap2020/data_science_roadmap_2020.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TechTopics/DataScienceRoadMap2020/data_science_roadmap_2020.md b/TechTopics/DataScienceRoadMap2020/data_science_roadmap_2020.md index f517e4f7..718ae7ec 100644 --- a/TechTopics/DataScienceRoadMap2020/data_science_roadmap_2020.md +++ b/TechTopics/DataScienceRoadMap2020/data_science_roadmap_2020.md @@ -70,6 +70,7 @@ Following is a schedule to learn data science step by step considering **4 hours - Bharti consultancy: https://www.youtube.com/playlist?list=PLyD1XCIRA3gQmN73dHwQWr4R08ABZFMtZ * Power BI (project) - codebasics sales insights project: https://www.youtube.com/playlist?list=PLeo1K3hjS3uva8pk1FI3iK9kCOKQdz1I9 + - personal finance management project: https://www.youtube.com/watch?v=pqSoCa2NGj4 ## Soft skills --------------- From cf1cbe9e825bcb21908e152444d7ccc6220e46ae Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Sun, 14 Feb 2021 20:20:22 +0530 Subject: [PATCH 27/39] Moved Exercises to seperate folder --- .../16_class_and_objects/16_class_and_object_exercise.md | 5 +---- .../16_class_and_objects/16_class_and_objects.py | 0 Basics/{Hindi => Exercise}/17_inheritance/17_inheritance.md | 5 +---- Basics/{Hindi => Exercise}/17_inheritance/17_inheritance.py | 0 .../18_multiple_inheritance/18_multiple_inheritance.md | 5 +---- .../18_multiple_inheritance/18_multiple_inheritance.py | 0 .../19_raise_exception_finally/19_raise_exception_finally.md | 5 +---- .../19_raise_exception_finally/19_raise_exception_finally.py | 0 Basics/{Hindi => Exercise}/20_Iterators/20_Iterators.md | 2 +- Basics/{Hindi => Exercise}/20_Iterators/20_Iterators.py | 0 Basics/{Hindi => Exercise}/21_generators/21_generators.md | 2 +- Basics/{Hindi => Exercise}/21_generators/21_generators.py | 0 .../22_list_set_dict_comprehension.md | 5 +---- .../22_list_set_dict_comprehension.py | 0 .../23_sets_frozensets/23_sets_frozensets.md | 2 +- .../23_sets_frozensets/23_sets_frozensets.py | 0 Basics/{Hindi => Exercise}/24_argparse/24_argparse.md | 2 +- Basics/{Hindi => Exercise}/24_argparse/24_argparse.py | 0 Basics/{Hindi => Exercise}/25_decorators/25_decorators.md | 2 +- Basics/{Hindi => Exercise}/25_decorators/25_decorators.py | 0 .../26_multithreading/26_multithreading.md | 2 +- .../26_multithreading/26_multithreading.py | 0 22 files changed, 11 insertions(+), 26 deletions(-) rename Basics/{Hindi => Exercise}/16_class_and_objects/16_class_and_object_exercise.md (72%) rename Basics/{Hindi => Exercise}/16_class_and_objects/16_class_and_objects.py (100%) rename Basics/{Hindi => Exercise}/17_inheritance/17_inheritance.md (75%) rename Basics/{Hindi => Exercise}/17_inheritance/17_inheritance.py (100%) rename Basics/{Hindi => Exercise}/18_multiple_inheritance/18_multiple_inheritance.md (76%) rename Basics/{Hindi => Exercise}/18_multiple_inheritance/18_multiple_inheritance.py (100%) rename Basics/{Hindi => Exercise}/19_raise_exception_finally/19_raise_exception_finally.md (77%) rename Basics/{Hindi => Exercise}/19_raise_exception_finally/19_raise_exception_finally.py (100%) rename Basics/{Hindi => Exercise}/20_Iterators/20_Iterators.md (68%) rename Basics/{Hindi => Exercise}/20_Iterators/20_Iterators.py (100%) rename Basics/{Hindi => Exercise}/21_generators/21_generators.md (64%) rename Basics/{Hindi => Exercise}/21_generators/21_generators.py (100%) rename Basics/{Hindi => Exercise}/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md (83%) rename Basics/{Hindi => Exercise}/22_list_set_dict_comprehension/22_list_set_dict_comprehension.py (100%) rename Basics/{Hindi => Exercise}/23_sets_frozensets/23_sets_frozensets.md (69%) rename Basics/{Hindi => Exercise}/23_sets_frozensets/23_sets_frozensets.py (100%) rename Basics/{Hindi => Exercise}/24_argparse/24_argparse.md (72%) rename Basics/{Hindi => Exercise}/24_argparse/24_argparse.py (100%) rename Basics/{Hindi => Exercise}/25_decorators/25_decorators.md (80%) rename Basics/{Hindi => Exercise}/25_decorators/25_decorators.py (100%) rename Basics/{Hindi => Exercise}/26_multithreading/26_multithreading.md (69%) rename Basics/{Hindi => Exercise}/26_multithreading/26_multithreading.py (100%) diff --git a/Basics/Hindi/16_class_and_objects/16_class_and_object_exercise.md b/Basics/Exercise/16_class_and_objects/16_class_and_object_exercise.md similarity index 72% rename from Basics/Hindi/16_class_and_objects/16_class_and_object_exercise.md rename to Basics/Exercise/16_class_and_objects/16_class_and_object_exercise.md index cf3883c4..d670cfa1 100644 --- a/Basics/Hindi/16_class_and_objects/16_class_and_object_exercise.md +++ b/Basics/Exercise/16_class_and_objects/16_class_and_object_exercise.md @@ -16,7 +16,4 @@ emp = Employee(1, "coder") 2. Use del property to first delete id attribute and then the entire object -[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/16_class_and_objects/16_class_and_objects.py) - - - +[Solution](https://github.com/codebasics/py/blob/master/Basics/Exercise/16_class_and_objects/16_class_and_objects.py) diff --git a/Basics/Hindi/16_class_and_objects/16_class_and_objects.py b/Basics/Exercise/16_class_and_objects/16_class_and_objects.py similarity index 100% rename from Basics/Hindi/16_class_and_objects/16_class_and_objects.py rename to Basics/Exercise/16_class_and_objects/16_class_and_objects.py diff --git a/Basics/Hindi/17_inheritance/17_inheritance.md b/Basics/Exercise/17_inheritance/17_inheritance.md similarity index 75% rename from Basics/Hindi/17_inheritance/17_inheritance.md rename to Basics/Exercise/17_inheritance/17_inheritance.md index 925e0945..68f76845 100644 --- a/Basics/Hindi/17_inheritance/17_inheritance.md +++ b/Basics/Exercise/17_inheritance/17_inheritance.md @@ -18,7 +18,4 @@ class Dog(Animal): super()-it refers Animal class,now you can call Animal's methods. ``` -[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/17_inheritance/17_inheritance.py) - - - +[Solution](https://github.com/codebasics/py/blob/master/Basics/Exercise/17_inheritance/17_inheritance.py) diff --git a/Basics/Hindi/17_inheritance/17_inheritance.py b/Basics/Exercise/17_inheritance/17_inheritance.py similarity index 100% rename from Basics/Hindi/17_inheritance/17_inheritance.py rename to Basics/Exercise/17_inheritance/17_inheritance.py diff --git a/Basics/Hindi/18_multiple_inheritance/18_multiple_inheritance.md b/Basics/Exercise/18_multiple_inheritance/18_multiple_inheritance.md similarity index 76% rename from Basics/Hindi/18_multiple_inheritance/18_multiple_inheritance.md rename to Basics/Exercise/18_multiple_inheritance/18_multiple_inheritance.md index 46f2c3ea..13fbc43b 100644 --- a/Basics/Hindi/18_multiple_inheritance/18_multiple_inheritance.md +++ b/Basics/Exercise/18_multiple_inheritance/18_multiple_inheritance.md @@ -20,7 +20,4 @@ Ans : just make subclass from teacher so that student will become teacher -[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/18_multiple_inheritance/18_multiple_inheritance.py) - - - +[Solution](https://github.com/codebasics/py/blob/master/Basics/Exercise/18_multiple_inheritance/18_multiple_inheritance.py) diff --git a/Basics/Hindi/18_multiple_inheritance/18_multiple_inheritance.py b/Basics/Exercise/18_multiple_inheritance/18_multiple_inheritance.py similarity index 100% rename from Basics/Hindi/18_multiple_inheritance/18_multiple_inheritance.py rename to Basics/Exercise/18_multiple_inheritance/18_multiple_inheritance.py diff --git a/Basics/Hindi/19_raise_exception_finally/19_raise_exception_finally.md b/Basics/Exercise/19_raise_exception_finally/19_raise_exception_finally.md similarity index 77% rename from Basics/Hindi/19_raise_exception_finally/19_raise_exception_finally.md rename to Basics/Exercise/19_raise_exception_finally/19_raise_exception_finally.md index da42cfea..21af38c1 100644 --- a/Basics/Hindi/19_raise_exception_finally/19_raise_exception_finally.md +++ b/Basics/Exercise/19_raise_exception_finally/19_raise_exception_finally.md @@ -20,7 +20,4 @@ create cusomException named ismajor and raise it if age<18. -[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/19_raise_exception_finally/19_raise_exception_finally.py) - - - +[Solution](https://github.com/codebasics/py/blob/master/Basics/Exercise/19_raise_exception_finally/19_raise_exception_finally.py) diff --git a/Basics/Hindi/19_raise_exception_finally/19_raise_exception_finally.py b/Basics/Exercise/19_raise_exception_finally/19_raise_exception_finally.py similarity index 100% rename from Basics/Hindi/19_raise_exception_finally/19_raise_exception_finally.py rename to Basics/Exercise/19_raise_exception_finally/19_raise_exception_finally.py diff --git a/Basics/Hindi/20_Iterators/20_Iterators.md b/Basics/Exercise/20_Iterators/20_Iterators.md similarity index 68% rename from Basics/Hindi/20_Iterators/20_Iterators.md rename to Basics/Exercise/20_Iterators/20_Iterators.md index 100ca74f..cfb58c81 100644 --- a/Basics/Hindi/20_Iterators/20_Iterators.md +++ b/Basics/Exercise/20_Iterators/20_Iterators.md @@ -5,4 +5,4 @@ -[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/20_Iterators/20_Iterators.py) +[Solution](https://github.com/codebasics/py/blob/master/Basics/Exercise/20_Iterators/20_Iterators.py) diff --git a/Basics/Hindi/20_Iterators/20_Iterators.py b/Basics/Exercise/20_Iterators/20_Iterators.py similarity index 100% rename from Basics/Hindi/20_Iterators/20_Iterators.py rename to Basics/Exercise/20_Iterators/20_Iterators.py diff --git a/Basics/Hindi/21_generators/21_generators.md b/Basics/Exercise/21_generators/21_generators.md similarity index 64% rename from Basics/Hindi/21_generators/21_generators.md rename to Basics/Exercise/21_generators/21_generators.md index 471441eb..55196662 100644 --- a/Basics/Hindi/21_generators/21_generators.md +++ b/Basics/Exercise/21_generators/21_generators.md @@ -13,4 +13,4 @@ for exmaple : 1 4 9 16 .. -[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/21_genrators/21_genrators.py) +[Solution](https://github.com/codebasics/py/blob/master/Basics/Exercise/21_generators/21_generators.py) diff --git a/Basics/Hindi/21_generators/21_generators.py b/Basics/Exercise/21_generators/21_generators.py similarity index 100% rename from Basics/Hindi/21_generators/21_generators.py rename to Basics/Exercise/21_generators/21_generators.py diff --git a/Basics/Hindi/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md b/Basics/Exercise/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md similarity index 83% rename from Basics/Hindi/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md rename to Basics/Exercise/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md index dbbebc37..edb3e26d 100644 --- a/Basics/Hindi/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md +++ b/Basics/Exercise/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md @@ -27,7 +27,4 @@ integer = [1, -1, 2, -2, 3, -3] sq_set = {1, 4, 9} ``` - - - -[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/22_list_set_dict_comprehension/22_list_set_dict_comprehension.py) +[Solution](https://github.com/codebasics/py/blob/master/Basics/Exercise/22_list_set_dict_comprehension/22_list_set_dict_comprehension.py) diff --git a/Basics/Hindi/22_list_set_dict_comprehension/22_list_set_dict_comprehension.py b/Basics/Exercise/22_list_set_dict_comprehension/22_list_set_dict_comprehension.py similarity index 100% rename from Basics/Hindi/22_list_set_dict_comprehension/22_list_set_dict_comprehension.py rename to Basics/Exercise/22_list_set_dict_comprehension/22_list_set_dict_comprehension.py diff --git a/Basics/Hindi/23_sets_frozensets/23_sets_frozensets.md b/Basics/Exercise/23_sets_frozensets/23_sets_frozensets.md similarity index 69% rename from Basics/Hindi/23_sets_frozensets/23_sets_frozensets.md rename to Basics/Exercise/23_sets_frozensets/23_sets_frozensets.md index b711c4d9..d59b37a6 100644 --- a/Basics/Hindi/23_sets_frozensets/23_sets_frozensets.md +++ b/Basics/Exercise/23_sets_frozensets/23_sets_frozensets.md @@ -17,4 +17,4 @@ -[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/23_sets_frozensets/23_sets_frozensets.py) +[Solution](https://github.com/codebasics/py/blob/master/Basics/Exercise/23_sets_frozensets/23_sets_frozensets.py) diff --git a/Basics/Hindi/23_sets_frozensets/23_sets_frozensets.py b/Basics/Exercise/23_sets_frozensets/23_sets_frozensets.py similarity index 100% rename from Basics/Hindi/23_sets_frozensets/23_sets_frozensets.py rename to Basics/Exercise/23_sets_frozensets/23_sets_frozensets.py diff --git a/Basics/Hindi/24_argparse/24_argparse.md b/Basics/Exercise/24_argparse/24_argparse.md similarity index 72% rename from Basics/Hindi/24_argparse/24_argparse.md rename to Basics/Exercise/24_argparse/24_argparse.md index 45b66c09..0a6b5fef 100644 --- a/Basics/Hindi/24_argparse/24_argparse.md +++ b/Basics/Exercise/24_argparse/24_argparse.md @@ -10,4 +10,4 @@ example: 2. Find average marks for the three subjects using command line input of marks. -[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/24_argparse/24_argparse.py) +[Solution](https://github.com/codebasics/py/blob/master/Basics/Exercise/24_argparse/24_argparse.py) diff --git a/Basics/Hindi/24_argparse/24_argparse.py b/Basics/Exercise/24_argparse/24_argparse.py similarity index 100% rename from Basics/Hindi/24_argparse/24_argparse.py rename to Basics/Exercise/24_argparse/24_argparse.py diff --git a/Basics/Hindi/25_decorators/25_decorators.md b/Basics/Exercise/25_decorators/25_decorators.md similarity index 80% rename from Basics/Hindi/25_decorators/25_decorators.md rename to Basics/Exercise/25_decorators/25_decorators.md index d11c387c..72e1566a 100644 --- a/Basics/Hindi/25_decorators/25_decorators.md +++ b/Basics/Exercise/25_decorators/25_decorators.md @@ -13,4 +13,4 @@ example: factorial(5) : 60 ``` -[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basicsHindi/25_decorators/25_decorators.py) +[Solution]https://github.com/codebasics/py/blob/master/Basics/Exercise/25_decorators/25_decorators.py) diff --git a/Basics/Hindi/25_decorators/25_decorators.py b/Basics/Exercise/25_decorators/25_decorators.py similarity index 100% rename from Basics/Hindi/25_decorators/25_decorators.py rename to Basics/Exercise/25_decorators/25_decorators.py diff --git a/Basics/Hindi/26_multithreading/26_multithreading.md b/Basics/Exercise/26_multithreading/26_multithreading.md similarity index 69% rename from Basics/Hindi/26_multithreading/26_multithreading.md rename to Basics/Exercise/26_multithreading/26_multithreading.md index 0777e663..8894abcb 100644 --- a/Basics/Hindi/26_multithreading/26_multithreading.md +++ b/Basics/Exercise/26_multithreading/26_multithreading.md @@ -13,4 +13,4 @@ for i in range(10): -[Solution](https://github.com/codebasics/py/blob/master/Basics/python_basics/26_multithreading/26_multithreading.py) +[Solution](https://github.com/codebasics/py/blob/master/Basics/Exercise/26_multithreading/26_multithreading.py) diff --git a/Basics/Hindi/26_multithreading/26_multithreading.py b/Basics/Exercise/26_multithreading/26_multithreading.py similarity index 100% rename from Basics/Hindi/26_multithreading/26_multithreading.py rename to Basics/Exercise/26_multithreading/26_multithreading.py From 40c98bb15209548528dd04f794c4cbcd1d209078 Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 15 Feb 2021 14:04:28 +0530 Subject: [PATCH 28/39] changed - location exercise --- .../2_variables/2_variables_exercise.ipynb} | 0 .../2_variables/2_variables_exercise.md} | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename Basics/{Hindi/1_Variables/Exercise/1_variables_exercise.ipynb => Exercise/2_variables/2_variables_exercise.ipynb} (100%) rename Basics/{Hindi/1_Variables/1_variables_exercise.md => Exercise/2_variables/2_variables_exercise.md} (91%) diff --git a/Basics/Hindi/1_Variables/Exercise/1_variables_exercise.ipynb b/Basics/Exercise/2_variables/2_variables_exercise.ipynb similarity index 100% rename from Basics/Hindi/1_Variables/Exercise/1_variables_exercise.ipynb rename to Basics/Exercise/2_variables/2_variables_exercise.ipynb diff --git a/Basics/Hindi/1_Variables/1_variables_exercise.md b/Basics/Exercise/2_variables/2_variables_exercise.md similarity index 91% rename from Basics/Hindi/1_Variables/1_variables_exercise.md rename to Basics/Exercise/2_variables/2_variables_exercise.md index 71764281..0ec7c413 100644 --- a/Basics/Hindi/1_Variables/1_variables_exercise.md +++ b/Basics/Exercise/2_variables/2_variables_exercise.md @@ -11,4 +11,4 @@ record^one continue - [Solution](https://github.com/codebasics/py/blob/master/Basics/Hindi/1_Variables/Exercise/1_variables_exercise.ipynb) \ No newline at end of file + [Solution](https://github.com/codebasics/py/blob/master/Basics/Exercise/2_variables/2_variables_exercise.ipynb) \ No newline at end of file From 7c683843677bec037ccef020e540c974b43e3800 Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 15 Feb 2021 14:11:38 +0530 Subject: [PATCH 29/39] changed numbers exercise path --- .../3_numbers/3_numbers_exercise.py} | 0 .../3_numbers/3_numbers_exercise_description.md} | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename Basics/{Hindi/2_numbers/Exercise/2_numbers_exercise.py => Exercise/3_numbers/3_numbers_exercise.py} (100%) rename Basics/{Hindi/2_numbers/2_numbers_exercise_description.md => Exercise/3_numbers/3_numbers_exercise_description.md} (86%) diff --git a/Basics/Hindi/2_numbers/Exercise/2_numbers_exercise.py b/Basics/Exercise/3_numbers/3_numbers_exercise.py similarity index 100% rename from Basics/Hindi/2_numbers/Exercise/2_numbers_exercise.py rename to Basics/Exercise/3_numbers/3_numbers_exercise.py diff --git a/Basics/Hindi/2_numbers/2_numbers_exercise_description.md b/Basics/Exercise/3_numbers/3_numbers_exercise_description.md similarity index 86% rename from Basics/Hindi/2_numbers/2_numbers_exercise_description.md rename to Basics/Exercise/3_numbers/3_numbers_exercise_description.md index 3d44007c..0f6ea6e6 100644 --- a/Basics/Hindi/2_numbers/2_numbers_exercise_description.md +++ b/Basics/Exercise/3_numbers/3_numbers_exercise_description.md @@ -9,4 +9,4 @@ cost to replace all tiles. Calculate and print the cost using python (Hint: Use power operator ** to find area of a square) 4. Print binary representation of number 17 -[Solution](https://github.com/codebasics/py/blob/master/Basics/Hindi/2_numbers/Exercise/2_numbers_exercise.py) \ No newline at end of file +[Solution](https://github.com/codebasics/py/blob/master/Basics/Exercise/3_numbers/3_numbers_exercise.py) \ No newline at end of file From 8ee1fe2c6a8b501fc471093203181e96df79e28e Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 15 Feb 2021 14:21:37 +0530 Subject: [PATCH 30/39] changed path for strings --- .../4_strings/4_string_exercise_answer.py} | 0 .../4_strings/4_strings_exercise.md} | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename Basics/{Hindi/3_strings/Exercise/3_string_exercise_answer.py => Exercise/4_strings/4_string_exercise_answer.py} (100%) rename Basics/{Hindi/3_strings/3_strings_exercise.md => Exercise/4_strings/4_strings_exercise.md} (89%) diff --git a/Basics/Hindi/3_strings/Exercise/3_string_exercise_answer.py b/Basics/Exercise/4_strings/4_string_exercise_answer.py similarity index 100% rename from Basics/Hindi/3_strings/Exercise/3_string_exercise_answer.py rename to Basics/Exercise/4_strings/4_string_exercise_answer.py diff --git a/Basics/Hindi/3_strings/3_strings_exercise.md b/Basics/Exercise/4_strings/4_strings_exercise.md similarity index 89% rename from Basics/Hindi/3_strings/3_strings_exercise.md rename to Basics/Exercise/4_strings/4_strings_exercise.md index 83fc8bfe..bf9d1666 100644 --- a/Basics/Hindi/3_strings/3_strings_exercise.md +++ b/Basics/Exercise/4_strings/4_strings_exercise.md @@ -13,4 +13,4 @@ wrong statement, the correct statement is 'maine 10 samosa khaye'. Replace incorrect words in original strong with new ones and print the new string. Also try to do this in one line. -[Solution](https://github.com/codebasics/py/blob/master/Basics/Hindi/3_strings/Exercise/3_string_exercise_answer.py) +[Solution](https://github.com/codebasics/py/blob/master/Basics/Exercise/4_strings/4_string_exercise_answer.py) From 91f6ff5899f70ed2c4ddb222dca23facbfc76f6f Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 15 Feb 2021 14:24:01 +0530 Subject: [PATCH 31/39] changed lists exercise path --- Basics/{Hindi => Exercise}/5_lists/5_lists_exercise.md | 2 +- .../5_lists/Exercise => Exercise/5_lists}/5_lists_exercise.py | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename Basics/{Hindi => Exercise}/5_lists/5_lists_exercise.md (93%) rename Basics/{Hindi/5_lists/Exercise => Exercise/5_lists}/5_lists_exercise.py (100%) diff --git a/Basics/Hindi/5_lists/5_lists_exercise.md b/Basics/Exercise/5_lists/5_lists_exercise.md similarity index 93% rename from Basics/Hindi/5_lists/5_lists_exercise.md rename to Basics/Exercise/5_lists/5_lists_exercise.md index c1922f1d..f521edc8 100644 --- a/Basics/Hindi/5_lists/5_lists_exercise.md +++ b/Basics/Exercise/5_lists/5_lists_exercise.md @@ -34,7 +34,7 @@ Using this find out, -[Solution](https://github.com/codebasics/py/blob/master/Basics/Hindi/5_lists/Exercise/5_lists_exercise.py) +[Solution](https://github.com/codebasics/py/blob/master/Basics/Exercise/5_lists/5_lists_exercise.py) diff --git a/Basics/Hindi/5_lists/Exercise/5_lists_exercise.py b/Basics/Exercise/5_lists/5_lists_exercise.py similarity index 100% rename from Basics/Hindi/5_lists/Exercise/5_lists_exercise.py rename to Basics/Exercise/5_lists/5_lists_exercise.py From 017539523dab5f949003a007ca5239bd1282f01b Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 15 Feb 2021 14:29:13 +0530 Subject: [PATCH 32/39] changed paths --- .../6_exercise1_1.py => Exercise/8_if/8_exercise1_1.py} | 0 .../6_exercise1_2.py => Exercise/8_if/8_exercise1_2.py} | 0 .../6_exercise2.py => Exercise/8_if/8_exercise2.py} | 0 .../8_if/8_exercise_description.md} | 6 +++--- 4 files changed, 3 insertions(+), 3 deletions(-) rename Basics/{Hindi/6_if/Exercise/6_exercise1_1.py => Exercise/8_if/8_exercise1_1.py} (100%) rename Basics/{Hindi/6_if/Exercise/6_exercise1_2.py => Exercise/8_if/8_exercise1_2.py} (100%) rename Basics/{Hindi/6_if/Exercise/6_exercise2.py => Exercise/8_if/8_exercise2.py} (100%) rename Basics/{Hindi/6_if/6_exercise_description.md => Exercise/8_if/8_exercise_description.md} (88%) diff --git a/Basics/Hindi/6_if/Exercise/6_exercise1_1.py b/Basics/Exercise/8_if/8_exercise1_1.py similarity index 100% rename from Basics/Hindi/6_if/Exercise/6_exercise1_1.py rename to Basics/Exercise/8_if/8_exercise1_1.py diff --git a/Basics/Hindi/6_if/Exercise/6_exercise1_2.py b/Basics/Exercise/8_if/8_exercise1_2.py similarity index 100% rename from Basics/Hindi/6_if/Exercise/6_exercise1_2.py rename to Basics/Exercise/8_if/8_exercise1_2.py diff --git a/Basics/Hindi/6_if/Exercise/6_exercise2.py b/Basics/Exercise/8_if/8_exercise2.py similarity index 100% rename from Basics/Hindi/6_if/Exercise/6_exercise2.py rename to Basics/Exercise/8_if/8_exercise2.py diff --git a/Basics/Hindi/6_if/6_exercise_description.md b/Basics/Exercise/8_if/8_exercise_description.md similarity index 88% rename from Basics/Hindi/6_if/6_exercise_description.md rename to Basics/Exercise/8_if/8_exercise_description.md index dac4e865..c0f1d9d9 100644 --- a/Basics/Hindi/6_if/6_exercise_description.md +++ b/Basics/Exercise/8_if/8_exercise_description.md @@ -12,8 +12,8 @@ 2. If it is below 80 to 100 range then print that sugar is low 3. If it is above 100 then print that it is high otherwise print that it is normal -[Solution - Exercise 1.i](https://github.com/codebasics/py/blob/master/Basics/Hindi/6_if/Exercise/6_exercise1_1.py) +[Solution - Exercise 1.i](https://github.com/codebasics/py/blob/master/Basics/Exercise/8_if/8_exercise1_1.py) -[Solution - Exercise 1.ii](https://github.com/codebasics/py/blob/master/Basics/Hindi/6_if/Exercise/6_exercise1_2.py) +[Solution - Exercise 1.ii](https://github.com/codebasics/py/blob/master/Basics/Exercise/8_if/8_exercise1_2.py) -[Solution - Exercise 2](https://github.com/codebasics/py/blob/master/Basics/Hindi/6_if/Exercise/6_exercise2.py) \ No newline at end of file +[Solution - Exercise 2](https://github.com/codebasics/py/blob/master/Basics/Exercise/8_if/8_exercise2.py) \ No newline at end of file From 8fc2ccdf321a1e0f43b2010f4d62221e559b1841 Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 15 Feb 2021 14:46:20 +0530 Subject: [PATCH 33/39] changed path --- .../7_for_exercise.md => Exercise/9_for/9_for_exercise.md} | 2 +- .../7_for_exercise.py => Exercise/9_for/9_for_exercise.py} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename Basics/{Hindi/7_for/7_for_exercise.md => Exercise/9_for/9_for_exercise.md} (91%) rename Basics/{Hindi/7_for/Exercise/7_for_exercise.py => Exercise/9_for/9_for_exercise.py} (100%) diff --git a/Basics/Hindi/7_for/7_for_exercise.md b/Basics/Exercise/9_for/9_for_exercise.md similarity index 91% rename from Basics/Hindi/7_for/7_for_exercise.md rename to Basics/Exercise/9_for/9_for_exercise.md index d3c265b2..bb3c858b 100644 --- a/Basics/Hindi/7_for/7_for_exercise.md +++ b/Basics/Exercise/9_for/9_for_exercise.md @@ -30,4 +30,4 @@ found then it should print that as well. ``` -[Solution](https://github.com/codebasics/py/blob/master/Basics/Hindi/7_for/Exercise/7_for_exercise.py) \ No newline at end of file +[Solution](https://github.com/codebasics/py/blob/master/Basics/Exercise/9_for/9_for_exercise.py) \ No newline at end of file diff --git a/Basics/Hindi/7_for/Exercise/7_for_exercise.py b/Basics/Exercise/9_for/9_for_exercise.py similarity index 100% rename from Basics/Hindi/7_for/Exercise/7_for_exercise.py rename to Basics/Exercise/9_for/9_for_exercise.py From e7987b6a27dad250dd428fc86e31b37c4e1be6f1 Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 15 Feb 2021 14:49:09 +0530 Subject: [PATCH 34/39] changed paths --- .../10_functions/10_functions_exercise.md} | 2 +- .../10_functions/10_functions_exercise.py} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename Basics/{Hindi/8_functions/8_functions_exercise.md => Exercise/10_functions/10_functions_exercise.md} (87%) rename Basics/{Hindi/8_functions/Exercise/8_functions_exercise.py => Exercise/10_functions/10_functions_exercise.py} (100%) diff --git a/Basics/Hindi/8_functions/8_functions_exercise.md b/Basics/Exercise/10_functions/10_functions_exercise.md similarity index 87% rename from Basics/Hindi/8_functions/8_functions_exercise.md rename to Basics/Exercise/10_functions/10_functions_exercise.md index b7cd6a50..bfc6bd97 100644 --- a/Basics/Hindi/8_functions/8_functions_exercise.md +++ b/Basics/Exercise/10_functions/10_functions_exercise.md @@ -25,4 +25,4 @@ if input is 4 then it should print ``` Basically number of lines it prints is equal to that number. (Hint: you need to use two for loops) -[Solution](https://github.com/codebasics/py/blob/master/Basics/Hindi/8_functions/Exercise/8_functions_exercise.py) \ No newline at end of file +[Solution](https://github.com/codebasics/py/blob/master/Basics/Exercise/10_functions/10_functions_exercise.py) \ No newline at end of file diff --git a/Basics/Hindi/8_functions/Exercise/8_functions_exercise.py b/Basics/Exercise/10_functions/10_functions_exercise.py similarity index 100% rename from Basics/Hindi/8_functions/Exercise/8_functions_exercise.py rename to Basics/Exercise/10_functions/10_functions_exercise.py From 8e59965b7ba5876aafe3c7d9afc6c97791b739c5 Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 15 Feb 2021 14:53:25 +0530 Subject: [PATCH 35/39] changed paths --- .../11_dict_exercise_1_country_population.py | 0 .../11_dict_tuples}/11_dict_exercise_2_stocks.py | 0 .../11_dict_tuples}/11_dict_exercise_3_circle.py | 0 .../11_dict_tuples}/11_dict_tuple_exercise.md | 6 +++--- 4 files changed, 3 insertions(+), 3 deletions(-) rename Basics/{Hindi/11_dict_tuple/Exercise => Exercise/11_dict_tuples}/11_dict_exercise_1_country_population.py (100%) rename Basics/{Hindi/11_dict_tuple/Exercise => Exercise/11_dict_tuples}/11_dict_exercise_2_stocks.py (100%) rename Basics/{Hindi/11_dict_tuple/Exercise => Exercise/11_dict_tuples}/11_dict_exercise_3_circle.py (100%) rename Basics/{Hindi/11_dict_tuple => Exercise/11_dict_tuples}/11_dict_tuple_exercise.md (86%) diff --git a/Basics/Hindi/11_dict_tuple/Exercise/11_dict_exercise_1_country_population.py b/Basics/Exercise/11_dict_tuples/11_dict_exercise_1_country_population.py similarity index 100% rename from Basics/Hindi/11_dict_tuple/Exercise/11_dict_exercise_1_country_population.py rename to Basics/Exercise/11_dict_tuples/11_dict_exercise_1_country_population.py diff --git a/Basics/Hindi/11_dict_tuple/Exercise/11_dict_exercise_2_stocks.py b/Basics/Exercise/11_dict_tuples/11_dict_exercise_2_stocks.py similarity index 100% rename from Basics/Hindi/11_dict_tuple/Exercise/11_dict_exercise_2_stocks.py rename to Basics/Exercise/11_dict_tuples/11_dict_exercise_2_stocks.py diff --git a/Basics/Hindi/11_dict_tuple/Exercise/11_dict_exercise_3_circle.py b/Basics/Exercise/11_dict_tuples/11_dict_exercise_3_circle.py similarity index 100% rename from Basics/Hindi/11_dict_tuple/Exercise/11_dict_exercise_3_circle.py rename to Basics/Exercise/11_dict_tuples/11_dict_exercise_3_circle.py diff --git a/Basics/Hindi/11_dict_tuple/11_dict_tuple_exercise.md b/Basics/Exercise/11_dict_tuples/11_dict_tuple_exercise.md similarity index 86% rename from Basics/Hindi/11_dict_tuple/11_dict_tuple_exercise.md rename to Basics/Exercise/11_dict_tuples/11_dict_tuple_exercise.md index 94d3511d..75f0c415 100644 --- a/Basics/Hindi/11_dict_tuple/11_dict_tuple_exercise.md +++ b/Basics/Exercise/11_dict_tuples/11_dict_tuple_exercise.md @@ -21,7 +21,7 @@ 2. remove: when user inputs remove it should ask for a country to remove. If country exist in our dictionary then remove it and print new dictionary using format shown above in (a). Else print that country doesn't exist! 3. query: on this again ask user for which country he or she wants to query. When user inputs that country it will print population of that country. -[Solution](https://github.com/codebasics/py/blob/master/Basics/Hindi/11_dict_tuple/Exercise/11_dict_exercise_1_country_population.py) +[Solution](https://github.com/codebasics/py/blob/master/Basics/Exercise/11_dict_tuples/11_dict_exercise_1_country_population.py) 2. You are given following list of stocks and their prices in last 3 days, @@ -40,8 +40,8 @@ ``` 2. add: When user enters 'add', it asks for stock ticker and price. If stock already exist in your list (like info, ril etc) then it will append the price to the list. Otherwise it will create new entry in your dictionary. For example entering 'tata' and 560 will add tata ==> [560] to the dictionary of stocks. -[Solution](https://github.com/codebasics/py/blob/master/Basics/Hindi/11_dict_tuple/Exercise/11_dict_exercise_2_stocks.py) +[Solution](https://github.com/codebasics/py/blob/master/Basics/Exercise/11_dict_tuples/11_dict_exercise_2_stocks.py) 3. Write circle_calc() function that takes radius of a circle as an input from user and then it calculates and returns area, circumference and diameter. You should get these values in your main program by calling circle_calc function and then print them -[Solution](https://github.com/codebasics/py/blob/master/Basics/Hindi/11_dict_tuple/Exercise/11_dict_exercise_3_circle.py) \ No newline at end of file +[Solution](https://github.com/codebasics/py/blob/master/Basics/Exercise/11_dict_tuples/11_dict_exercise_3_circle.py) \ No newline at end of file From 890e8fabdad86504e4589451ff434c7df6f428ea Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 15 Feb 2021 15:01:55 +0530 Subject: [PATCH 36/39] changed paths --- .../13_read_write_files}/exercise_1_poem.py | 0 .../13_read_write_files/exercise_2_stocks.py | 12 ++++++++++++ .../13_read_write_files}/output.csv | 0 .../13_read_write_files}/poem.txt | 0 .../13_read_write_files}/read_write_file_exercise.md | 8 ++++---- .../13_read_write_files}/stocks.csv | 0 .../12_read_write_file/Exercise/exercise_2_stocks.py | 12 ------------ 7 files changed, 16 insertions(+), 16 deletions(-) rename Basics/{Hindi/12_read_write_file/Exercise => Exercise/13_read_write_files}/exercise_1_poem.py (100%) create mode 100644 Basics/Exercise/13_read_write_files/exercise_2_stocks.py rename Basics/{Hindi/12_read_write_file/Exercise => Exercise/13_read_write_files}/output.csv (100%) rename Basics/{Hindi/12_read_write_file/Exercise => Exercise/13_read_write_files}/poem.txt (100%) rename Basics/{Hindi/12_read_write_file => Exercise/13_read_write_files}/read_write_file_exercise.md (51%) rename Basics/{Hindi/12_read_write_file/Exercise => Exercise/13_read_write_files}/stocks.csv (100%) delete mode 100644 Basics/Hindi/12_read_write_file/Exercise/exercise_2_stocks.py diff --git a/Basics/Hindi/12_read_write_file/Exercise/exercise_1_poem.py b/Basics/Exercise/13_read_write_files/exercise_1_poem.py similarity index 100% rename from Basics/Hindi/12_read_write_file/Exercise/exercise_1_poem.py rename to Basics/Exercise/13_read_write_files/exercise_1_poem.py diff --git a/Basics/Exercise/13_read_write_files/exercise_2_stocks.py b/Basics/Exercise/13_read_write_files/exercise_2_stocks.py new file mode 100644 index 00000000..f71442ba --- /dev/null +++ b/Basics/Exercise/13_read_write_files/exercise_2_stocks.py @@ -0,0 +1,12 @@ +with open("stocks.csv", "r") as f, open("output.csv", "w") as out: + out.write("Company Name,PE Ratio, PB Ratio\n") + next(f) # This will skip first line in the file which is a header + for line in f: + tokens = line.split(",") + stock = tokens[0] + price = float(tokens[1]) + eps = float(tokens[2]) + book = float(tokens[3]) + pe = round(price / eps, 2) + pb = round(price / book, 2) + out.write(f"{stock},{pe},{pb}\n") diff --git a/Basics/Hindi/12_read_write_file/Exercise/output.csv b/Basics/Exercise/13_read_write_files/output.csv similarity index 100% rename from Basics/Hindi/12_read_write_file/Exercise/output.csv rename to Basics/Exercise/13_read_write_files/output.csv diff --git a/Basics/Hindi/12_read_write_file/Exercise/poem.txt b/Basics/Exercise/13_read_write_files/poem.txt similarity index 100% rename from Basics/Hindi/12_read_write_file/Exercise/poem.txt rename to Basics/Exercise/13_read_write_files/poem.txt diff --git a/Basics/Hindi/12_read_write_file/read_write_file_exercise.md b/Basics/Exercise/13_read_write_files/read_write_file_exercise.md similarity index 51% rename from Basics/Hindi/12_read_write_file/read_write_file_exercise.md rename to Basics/Exercise/13_read_write_files/read_write_file_exercise.md index 86e5ded5..d73d08d7 100644 --- a/Basics/Hindi/12_read_write_file/read_write_file_exercise.md +++ b/Basics/Exercise/13_read_write_files/read_write_file_exercise.md @@ -1,10 +1,10 @@ ## Exercise: Python Read Write File -1. [poem.txt](https://github.com/codebasics/py/blob/master/Basics/Hindi/12_read_write_file/Exercise/poem.txt) contains famous poem "Road not taken" by poet Robert Frost. You have to read this file in your python program and find out words with maximum occurance. +1. [poem.txt](https://github.com/codebasics/py/blob/master/Basics/Exercise/13_read_write_files/poem.txt) contains famous poem "Road not taken" by poet Robert Frost. You have to read this file in your python program and find out words with maximum occurance. -[Solution](https://github.com/codebasics/py/blob/master/Basics/Hindi/12_read_write_file/Exercise/exercise_1_poem.py) +[Solution](https://github.com/codebasics/py/blob/master/Basics/Exercise/13_read_write_files/exercise_2_stocks.py) -2. [stocks.csv](https://github.com/codebasics/py/blob/master/Basics/Hindi/12_read_write_file/Exercise/stocks.csv) contains stock price, earnings per share and book value. You are writing a stock market application that will process this file and create a new file +2. [stocks.csv](https://github.com/codebasics/py/blob/master/Basics/Exercise/13_read_write_files/stocks.csv) contains stock price, earnings per share and book value. You are writing a stock market application that will process this file and create a new file with financial metrics such as pe ratio and price to book ratio. These are calculated as, ``` pe ratio = price / earnings per share @@ -26,4 +26,4 @@ Output.csv should look like this, |Reliance|22.23|2.25| |Tata Steel|4.39|0.68| -[Solution](https://github.com/codebasics/py/blob/master/Basics/Hindi/12_read_write_file/Exercise/exercise_2_stocks.py) +[Solution](https://github.com/codebasics/py/blob/master/Basics/Exercise/13_read_write_files/exercise_2_stocks.py) diff --git a/Basics/Hindi/12_read_write_file/Exercise/stocks.csv b/Basics/Exercise/13_read_write_files/stocks.csv similarity index 100% rename from Basics/Hindi/12_read_write_file/Exercise/stocks.csv rename to Basics/Exercise/13_read_write_files/stocks.csv diff --git a/Basics/Hindi/12_read_write_file/Exercise/exercise_2_stocks.py b/Basics/Hindi/12_read_write_file/Exercise/exercise_2_stocks.py deleted file mode 100644 index beff07a7..00000000 --- a/Basics/Hindi/12_read_write_file/Exercise/exercise_2_stocks.py +++ /dev/null @@ -1,12 +0,0 @@ -with open("stocks.csv","r") as f, open("output.csv","w") as out: - out.write("Company Name,PE Ratio, PB Ratio\n") - next(f) # This will skip first line in the file which is a header - for line in f: - tokens=line.split(',') - stock = tokens[0] - price = float(tokens[1]) - eps = float(tokens[2]) - book = float(tokens[3]) - pe = round(price/eps,2) - pb = round(price/book,2) - out.write(f"{stock},{pe},{pb}\n") From 059b22e00b7d72ce0baa6cc1ac2e80787388a44f Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 15 Feb 2021 15:03:39 +0530 Subject: [PATCH 37/39] changed path --- .../15_exception_handling}/exception_handing_exercise.md | 0 .../15_exception_handling}/exception_handling_solution.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename Basics/{Hindi/14_exception_handling/Exercise => Exercise/15_exception_handling}/exception_handing_exercise.md (100%) rename Basics/{Hindi/14_exception_handling/Exercise => Exercise/15_exception_handling}/exception_handling_solution.py (100%) diff --git a/Basics/Hindi/14_exception_handling/Exercise/exception_handing_exercise.md b/Basics/Exercise/15_exception_handling/exception_handing_exercise.md similarity index 100% rename from Basics/Hindi/14_exception_handling/Exercise/exception_handing_exercise.md rename to Basics/Exercise/15_exception_handling/exception_handing_exercise.md diff --git a/Basics/Hindi/14_exception_handling/Exercise/exception_handling_solution.py b/Basics/Exercise/15_exception_handling/exception_handling_solution.py similarity index 100% rename from Basics/Hindi/14_exception_handling/Exercise/exception_handling_solution.py rename to Basics/Exercise/15_exception_handling/exception_handling_solution.py From e2adec3da80c2eeefadf9b258f9fd99d2d5d16da Mon Sep 17 00:00:00 2001 From: Karandeep Singh Grover <30365139+groverkds@users.noreply.github.com> Date: Mon, 15 Feb 2021 15:40:30 +0530 Subject: [PATCH 38/39] Update 22_list_set_dict_comprehension.md --- .../22_list_set_dict_comprehension.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basics/Exercise/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md b/Basics/Exercise/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md index edb3e26d..2f14897e 100644 --- a/Basics/Exercise/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md +++ b/Basics/Exercise/22_list_set_dict_comprehension/22_list_set_dict_comprehension.md @@ -1,4 +1,4 @@ -## Exercise: Generators +## Exercise: List Set Dict Comprehensions 1. Create a Dictionary which contains the Binary values mapping with numbers found in the below integer and binary and save it in binary_dict. From ecfb51a8f996e9d37b97d3bcb56b26b09aea47aa Mon Sep 17 00:00:00 2001 From: Karandeep Grover Date: Mon, 15 Feb 2021 16:58:30 +0530 Subject: [PATCH 39/39] Fixed issues with link --- Basics/Exercise/25_decorators/25_decorators.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basics/Exercise/25_decorators/25_decorators.md b/Basics/Exercise/25_decorators/25_decorators.md index 72e1566a..995bee68 100644 --- a/Basics/Exercise/25_decorators/25_decorators.md +++ b/Basics/Exercise/25_decorators/25_decorators.md @@ -13,4 +13,4 @@ example: factorial(5) : 60 ``` -[Solution]https://github.com/codebasics/py/blob/master/Basics/Exercise/25_decorators/25_decorators.py) +[Solution](https://github.com/codebasics/py/blob/master/Basics/Exercise/25_decorators/25_decorators.py)