Проверка __ iter __ При сглаживании словаря присутствие может быть довольно странным:
>>> def flatten(*args):
... output = []
... for arg in args:
... if hasattr(arg, '__iter__'):
... output.extend(flatten(*arg))
... else:
... output.append(arg)
... return output
...
>>> adict = {1:2, 3:4, 5:6}
>>> blist = ['a', 'b', 'c']
>>> raw = [adict, blist]
>>> flatten(raw)
[1, 3, 5, 'a', 'b', 'c']
Я думаю, что flatten должен работать только для списков и кортежей:
import types
def flatten(*args):
output = []
for arg in args:
if isinstance(arg, (types.ListType, types.TupleType)):
output.extend(flatten(*list(arg)))
else:
output.append(arg)
return output
adict = {1:2, 3:4, 5:6}
blist = ['a', 'b', 'c']
raw = [adict, blist]
print flatten(raw)