2013-08-16 49 views
0

如何轉置3d列表m4c以便獲得所需的輸出?轉置3d列表(Python)

m4c = [[['A ', ' ', ' ', ' ', ' ', ' ', ' ', ' '], ['B ', ' ', ' ', ' '], ['C ', ' ', ' ', ' ', ' ', ' ', ' ', ' \n']], [['E ', 'F#', 'E ', 'E ', 'F#', 'E ', ' ', 'E '], ['E ', 'F#', 'E ', 'E '], ['E ', 'F#', 'E ', 'E ', 'F#', ' ', 'E ', 'F#']]] 

所需的輸出:

[[['A ','E '], [' ','F#'], [' ','E '], [' ','E '], [' ','F#'], [' ','E '], [' ',' '], [' ','E ']], 
[['B ','E '], [' ','F#'], [' ','E '], [' ','E ']], 
[['C ','E '], [' ','F#'], [' ','E '], [' ','E '], [' ','F#'], [' ','E '], [' ',' '], [' ','E ']]] 
+0

該線程是我的,但我不明白如何在一般的調換(我有多個輸入列表)。 – user1189952

回答

1

我不知道,如果你的m4c[0][2]是正確的:['C ', ' ', ' ', ' ', ' ', ' ', ' ', ' \n'],但如果它並且元組對你來說是可以的,那麼簡單的解決方案可以是:

>>> [zip(m4c[0][i], m4c[1][i]) for i in range(len(m4c[0]))] 
[[('A ', 'E '), (' ', 'F#'), (' ', 'E '), (' ', 'E '), (' ', 'F#'), (' ', 'E '), (' ', ' '), (' ', 'E ')],\ 
[('B ', 'E '), (' ', 'F#'), (' ', 'E '), (' ', 'E ')], \ 
[('C ', 'E '), (' ', 'F#'), (' ', 'E '), (' ', 'E '), (' ', 'F#'), (' ', ' '), (' ', 'E '), (' \n', 'F#')]] 

或者更一般:

>>> [zip(*[m4c[j][i] for j in range(len(m4c))]) for i in range(len(m4c[0]))] 
1

這看起來主要是你想要的輸出相匹配的對我說:

>>> pprint(m4c) 
[[['A ', ' ', ' ', ' ', ' ', ' ', ' ', ' '], 
    ['B ', ' ', ' ', ' '], 
    ['C ', ' ', ' ', ' ', ' ', ' ', ' ', ' \n']], 
[['E ', 'F#', 'E ', 'E ', 'F#', 'E ', ' ', 'E '], 
    ['E ', 'F#', 'E ', 'E '], 
    ['E ', 'F#', 'E ', 'E ', 'F#', ' ', 'E ', 'F#']]] 
>>> trans = list(zip(*x) for x in zip(*m4c)) 
>>> pprint(trans) 
[[('A ', 'E '), 
    (' ', 'F#'), 
    (' ', 'E '), 
    (' ', 'E '), 
    (' ', 'F#'), 
    (' ', 'E '), 
    (' ', ' '), 
    (' ', 'E ')], 
[('B ', 'E '), (' ', 'F#'), (' ', 'E '), (' ', 'E ')], 
[('C ', 'E '), 
    (' ', 'F#'), 
    (' ', 'E '), 
    (' ', 'E '), 
    (' ', 'F#'), 
    (' ', ' '), 
    (' ', 'E '), 
    (' \n', 'F#')]]