Skip to content

Instantly share code, notes, and snippets.

@lost-theory
Last active February 9, 2016 23:29
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lost-theory/264e0cbb1406f7f47b86 to your computer and use it in GitHub Desktop.
Save lost-theory/264e0cbb1406f7f47b86 to your computer and use it in GitHub Desktop.
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