Python修改列表列表

时间:2016-06-23 18:35:11

标签: python list python-3.x transpose

给出以下列表清单:

iters=[['EY11', 'EY12', 'EY13', 'EY14'],
       ['EY21', 'EY22', 'EY23', 'EY24'],
       ['PY11', 'PY12', 'PY13', 'PY14'],
       ['PY21', 'PY22', 'PY23', 'PY24']]

我想修改此列表以转置值(缺少更好的描述),如下所示:

iters=[['EY11', 'EY21', 'PY11', 'PY21'],
       ['EY12', 'EY22', 'PY12', 'PY22'],
       ['EY13', 'EY23', 'PY13', 'PY23'],
       ['EY14', 'EY24', 'PY14', 'PY24']]

我可以像这样在一个子列表中执行此操作:

[i[0] for i in iters]

但是现在我只需要知道如何遍历每个子列表并自动创建新的列表列表(另外,我无法预测实际数据中会有多少个子列表,所以我想避免在i [0]中对当前数量的子列表进行硬编码。

提前致谢!

4 个答案:

答案 0 :(得分:4)

最简洁的解决方案是使用the zip function与星形解包:

newiters = list(zip(*iters))  # Wrapping in list not needed on Python 2

这几乎可以得到你想要的,但不完全是因为它将是list的{​​{1}};如果没关系,你就完成了,如果不是,你只需调整它就可以转换为tuple s:

list

这有效的原因是星形解包使得好像你将newiters = list(map(list, zip(*iters))) # Wrapping in list not needed on Python 2 的每个元素作为顺序位置参数传递给iters,例如:

zip

并且zip(['EY11', 'EY12', 'EY13', 'EY14'], ['EY21', 'EY22', 'EY23', 'EY24'], ['PY11', 'PY12', 'PY13', 'PY14'], ['PY21', 'PY22', 'PY23', 'PY24']) 的整个schtick正在通过匹配一组迭代中的偏移来创建新的zip值,因此第一个tuple是每个参数的第一个元素({ {1}}),第二个是每个参数的第二个元素(tuple)等。

注意:这假定所有子('EY11', 'EY21', 'PY11', 'PY21')的长度相同。如果不是,您将丢失数据,因为('EY12', 'EY22', 'PY12', 'PY22')在最短的可迭代时间停止时停止。如果您愿意,可以使用itertools.zip_longest将较短的迭代次数填充到最长迭代的长度。

答案 1 :(得分:1)

你的意思是这样的:

iters=[['EY11', 'EY12', 'EY13', 'EY14'],
       ['EY21', 'EY22', 'EY23', 'EY24'],
       ['PY11', 'PY12', 'PY13', 'PY14'],
       ['PY21', 'PY22', 'PY23', 'PY24']]


def iterating(iters):
    if len(iters) > 0:
        range_len = len(iters[0]) 
        ret = []
        for idx in range(0,range_len):
            ret.append([i[idx] for i in iters])
        return ret
    return None

if __name__ == '__main__':
    print iterating(iters)

将输出到:

[['EY11', 'EY21', 'PY11', 'PY21'], ['EY12', 'EY22', 'PY12', 'PY22'], ['EY13', 'EY23', 'PY13', 'PY23'], ['EY14', 'EY24', 'PY14', 'PY24']]

该函数不是固定大小,但id确实假定列表中的所有列表都是相同的大小。

答案 2 :(得分:1)

这里是使用列表理解的一个班轮。

transp = [[i[x] for i in iters] for x in range(0,4)]

基本上你做了什么,除了遍历索引。

#Output
['EY11', 'EY21', 'PY11', 'PY21']
['EY12', 'EY22', 'PY12', 'PY22']
['EY13', 'EY23', 'PY13', 'PY23']
['EY14', 'EY24', 'PY14', 'PY24']

答案 3 :(得分:1)

如果这是您需要在阵列上执行的唯一复杂操作,那么其他解决方案之一可能是最好的。但是,如果你不介意引入numpy,那么有一个内置例程,称为transpose

import numpy as np
iters_np = np.array(iters).transpose()
print(iters_np)

>>>[['EY11' 'EY21' 'PY11' 'PY21']
>>> ['EY12' 'EY22' 'PY12' 'PY22']
>>> ['EY13' 'EY23' 'PY13' 'PY23']
>>> ['EY14' 'EY24' 'PY14' 'PY24']]