Last active
February 9, 2016 23:29
-
-
Save lost-theory/264e0cbb1406f7f47b86 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import yaml | |
tree = yaml.load(''' | |
--- | |
- folder1 | |
- folder2: | |
- subfolder1: | |
- deepfolder1 | |
- subolder2 | |
- folder3 | |
- folder4 | |
''') | |
def traverse(t, prefix=None): | |
prefix = prefix or [] | |
if len(t) == 0: | |
raise StopIteration | |
elif len(t) == 1: | |
first, rest = t[0], [] | |
else: | |
first, rest = t[0], t[1:] | |
#walk first element | |
if isinstance(first, str): | |
#it's a single node | |
yield prefix + [first] | |
elif isinstance(first, list): | |
#it's a list of nodes | |
for element in first: | |
yield from traverse(element, prefix=prefix) | |
elif isinstance(first, dict): | |
#there's another level of nesting | |
for sub in first: | |
yield from traverse(first[sub], prefix=(prefix + [sub])) | |
#walk rest of elements recursively | |
yield from traverse(rest, prefix=prefix) | |
print(tree) | |
print() | |
for expanded_path in traverse(tree): | |
print(expanded_path) | |
''' | |
Output: | |
$ bin/python traversal.py | |
['folder1', {'folder2': [{'subfolder1': ['deepfolder1']}, 'subolder2']}, 'folder3', 'folder4'] | |
['folder1'] | |
['folder2', 'subfolder1', 'deepfolder1'] | |
['folder2', 'subolder2'] | |
['folder3'] | |
['folder4'] | |
''' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment