对于解决此问题的完全一般方法,您可以考虑使用flatten上的众多变体之一,您可以找到
here,其中flatten是一个函数,它采用任意嵌套的迭代迭代次数并返回其中包含的项目的平面列表.
然后只需在a,b,c的压缩值上展平并转换为元组.
>>> from collections import Iterable
>>> def flatten(l):
... for i in l:
... if isinstance(i, Iterable) and not isinstance(i, basestring):
... for sub in flatten(i):
... yield sub
... else:
... yield i
...
>>> map(tuple, map(flatten, zip(a, b, c)))
[('a', 0, 4, 5, 6, 7), ('a', 1, 9, 10, 11, 12),
('a', 2, 14, 15, 16, 17), ('a', 3, 19, 20, 21, 22)]
或者更简洁,修改flatten以接受任意参数列表并返回元组.然后你需要的只是地图:
>>> def flat_tuple(*args):
... return tuple(flatten(args))
...
>>> map(flat_tuple, a, b, c)
[('a', 0, 4, 5, 6, 7), ('a', 1, 9, 10, 11, 12),
('a', 2, 14, 15, 16, 17), ('a', 3, 19, 20, 21, 22)]
如果这是一次性问题,上述方法可能比它的价值更麻烦.但是,如果您已经为其他目的定义了flatten,或者如果您经常这样做,以上可以为您节省很多麻烦!
否则,只是为了它的乐趣,这里是我喜欢的nneonneo答案的变体:
>>> [x + tuple(y) for x, y in zip(zip(a, b), c)]
[('a', 0, 4, 5, 6, 7), ('a', 1, 9, 10, 11, 12),
('a', 2, 14, 15, 16, 17), ('a', 3, 19, 20, 21, 22)]