Here's the illegible gibberish version of your function. Once you understand completely the following line of code, you will be well on your way to Python nirvana:
getNodes = lambda Foundry=None,Process=None: [node for node,foundries in dict.iteritems() if ((Foundry is None) and ((Process is None) or (len([foundry for foundry,processes in foundries.iteritems() if Process in processes]) > 0))) or ((Foundry in foundries) and ((Process is None) or (Process in foundries[Foundry])))] # ex: getNodes(Foundry="umc", Process="2p6m_1.8-3.3_sal_ms") # note: returns an empty list rather than None if no matching nodes exist # hint: You'll probably want to do rearrange your data structure or do some caching if you have a large dataset. The dict-and-list solution doesn't make this search very efficient. And: I just noticed that len() won't work with a generator expression as its argument. What's up with that? -- http://mail.python.org/mailman/listinfo/python-list