#!/usr/bin/env python3 import collections def uuid(): uuid.counter += 1 return 'UUID(%s)' % uuid.counter uuid.counter = 0 class FieldTree(object): def __init__(self, pairs): self.fields = collections.OrderedDict() for key, value in pairs: if isinstance(value, list): value = FieldTree(value) self.add(key, value) def __len__(self): result = 0 for value in self.fields.values(): if not isinstance(value, FieldTree): result += 1 else: result += len(value) return result def add(self, key, value): key = key if (key is not None) else uuid() self.fields[key] = value def get(self, i): counter = 1 for key, value in self.fields.items(): print(i, counter, key, value) if counter == i: return value if isinstance(value, FieldTree): try: result = value.get(i - counter) except ValueError: counter += len(value) else: return result counter += 1 raise ValueError() def test(): a = FieldTree(( ('id', 1234), ('name', 'John Smith'), ('phone', '555-1212') )) print(a.fields) print(a.get(1)) b = FieldTree([ ('tag', 'table'), ('contents', [('id', [('tag', 'tr'), ('contents', [(None, [('tag', 'td'), ('contents', [(None, 'id')])]), (None, [('tag', 'td'), ('contents', [(None, [('tag', 'input'), ('type', 'text'), ('value', 1234)])])])])]), ('name', ...), ('phone', ...)]) ]) print(b.get(15)) b = """ tag: "table" contents id | tag: "tr" | contents | + | | tag: "td" | | contents | | +: "id" | + | tag: "td" | contents | + | tag: "input" | type: "text" | value: "1234" name: ... phone: ... """ if __name__ == '__main__': test()