This summer the 4th annual PyBay conference dedicated to Python development was held. One of the speakers was Raymond Hettinger , a member of the Python Software Foundation (PFS) since 2003, a member of the PFS board of directors from 2008 to 2012. Raymond's merits in the PFS are very significant: he worked on creating sets (data type), generator expressions, "collections" and "itertools" modules, as well as an ordered dict. He's also well known for his contributions to the Python Cookbook.
Raymond's presentation was called "The Mental Game of Python". You can watch the entire recording of the presentation here . Raymond demonstrated using various strategies to simplify the development process and make the code simpler and therefore better. This mission is a variation of a data tree traversal task used by Raymond to demonstrate an incremental development approach.
In computer science, a tree is an abstract data type that simulates a hierarchical tree structure. All tree elements are called nodes . The lines connecting elements (or nodes) are called branches and nodes without children are called leaves or end-nodes . The topmost node in a tree is called the root node . Depth is the distance between a node and the root. Additionally, every node in a tree can be seen as the root node of the subtree rooted at that node.
In this mission you are given an arbitrary finite tree and a target. In case the target's type is
int
or
str
your task is to calculate how many leaves of the tree are equal to the target.
Otherwise, if the target's type is
list
or
dict
you need to calculate the number of subtrees which are equal to the target.
For a better understanding, have a look at the illustrations below (visual order matters for lists).
If encounter difficulties, try to watch this part of the
video
exposing the use of the incremental development approach.
Input: Two arguments:
- the first is an arbitrary finite tree data structure
- the second is a target , any type of [int, str, list, dict]
Output: The number (integer) of the leaves or subtrees that are equal to the given target.
Example:
tree_walker(tree=[1, "2", 3, [[3], 1, {1: "one"}]], target=1) == 2 #example #1 tree_walker(tree={"one": 1, "two":...