对于这个问题的完全通用方法,您可以考虑使用flatten上的许多变体之一,您可以找到here,其中flatten是一个函数,它接受任意嵌套的iterable并返回其中包含的项的平面列表。
然后将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以接受任意参数列表并返回元组。那么您只需要map:>>> 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)]