这不是最舒适的数据结构。我建议重构代码并选择3倍嵌套列表之外的其他内容来保存数据,但如果当前不可能,我建议使用以下方法:
import itertools
def flatten(iterable):
yield from itertools.chain.from_iterable(iterable)
result = []
for elements in zip(*map(flatten, samples)):
result.append(list(flatten(elements)))
举例来说,它给出了:
[['A', 'E', '1'],
['B', 'F', '2'],
['C', 'G', '3'],
['D', 'H', '4']]
测试2个以上的样品:
samples = [[[['A', 'E'], ['B', 'F']],
[['C', 'G'], ['D', 'H']]],
[[['1'], ['2']],
[['3'], ['4']]],
[[['5'], ['6']],
[['7'], ['8']]]]
给予:
[['A', 'E', '1', '5'],
['B', 'F', '2', '6'],
['C', 'G', '3', '7'],
['D', 'H', '4', '8']]
说明:
这个
flatten
generator function
只需展平嵌套iterable的1个级别。它基于
itertools.chain.from_iterable
功能。在
map(flatten, samples)
我们将此函数应用于
samples
:
>>> map(flatten, samples)
<map at 0x3c6685fef0> # <-- map object returned, to see result wrap it in `list`:
>>> list(map(flatten, samples))
[<generator object flatten at 0x0000003C67A2F9A8>, # <-- will flatten the 1st sample
<generator object flatten at 0x0000003C67A2FA98>, # <-- ... the 2nd
<generator object flatten at 0x0000003C67A2FB10>] # <-- ... the 3rd and so on if there are more
# We can see what each generator will give by applying `list` on each one of them
>>> list(map(list, map(flatten, samples)))
[[['A', 'E'], ['B', 'F'], ['C', 'G'], ['D', 'H']],
[['1'], ['2'], ['3'], ['4']],
[['5'], ['6'], ['7'], ['8']]]
接下来,我们可以使用
zip
在平坦的样本上迭代。请注意,我们不能将其应用于
map
直接对象:
>>> list(zip(map(flatten, samples)))
[(<generator object flatten at 0x0000003C66944138>,),
(<generator object flatten at 0x0000003C669441B0>,),
(<generator object flatten at 0x0000003C66944228>,)]
我们应该
unpack
首先:
>>> list(zip(*map(flatten, samples)))
[(['A', 'E'], ['1'], ['5']),
(['B', 'F'], ['2'], ['6']),
(['C', 'G'], ['3'], ['7']),
(['D', 'H'], ['4'], ['8'])]
# or in a for loop:
>>> for elements in zip(*map(flatten, samples)):
... print(elements)
(['A', 'E'], ['1'], ['5'])
(['B', 'F'], ['2'], ['6'])
(['C', 'G'], ['3'], ['7'])
(['D', 'H'], ['4'], ['8'])
最后,我们只需要加入每个
elements
把元组放在一起。我们可以用同样的
扁平化
功能:
>>> for elements in zip(*map(flatten, samples)):
... print(list(flatten(elements)))
['A', 'E', '1', '5']
['B', 'F', '2', '6']
['C', 'G', '3', '7']
['D', 'H', '4', '8']
您只需将其全部放回一个列表中,如第一个代码示例所示。