我有一个这样的列表列表:
allrows = [['NEPW46486', 'NEPW46550', 'sersic', 20.04, 21.12],
['NEPW89344', 'NEPW89346', 'sersic', 20.33, 19.66], ...]
我想创建一个新的列表列表,其中每个列表都对应一个“列”。我想要的输出是:
cols = [['NEPW46486', 'NEPW89344', ...], ['NEPW46550', 'NEPW89346', ...], ['sersic', 'sersic', ...], [20.04, 20.33, ...], [21.12, 19.66, ...]]
我认为我可以通过列表理解来做到这一点,就像这样:
cols = [[row[n] for row in allrows] for n in range(len(row))]
但是我得到NameError
未被定义的row
。我也尝试切换循环语句的顺序,但这并没有给我想要的输出(相反,它恰好给了我开始时的内容)。如何通过列表理解来实现所需的输出?
答案 0 :(得分:2)
您可以使用内置的zip()
函数像这样在列表理解中做到这一点:
allrows = [['NEPW46486', 'NEPW46550', 'sersic', 20.04, 21.12],
['NEPW89344', 'NEPW89346', 'sersic', 20.33, 19.66],]
cols = [list(col) for col in zip(*allrows)]
结果:
[['NEPW46486', 'NEPW89344'], ['NEPW46550', 'NEPW89346'], ['sersic', 'sersic'], [20.04, 20.33], [21.12, 19.66]]
有时称为“ transposing”(表示将列交换为行)的二维值矩阵。
答案 1 :(得分:1)
这就是内置zip
函数的目的。您只需要在调用清单时解压缩清单即可。像这样:
allrows = [['NEPW46486', 'NEPW46550', 'sersic', 20.04, 21.12],
['NEPW89344', 'NEPW89346', 'sersic', 20.33, 19.66]]
for item in zip(*allrows): # unpack with *allrows
print(item)
净值您
('NEPW46486', 'NEPW89344')
('NEPW46550', 'NEPW89346')
('sersic', 'sersic')
(20.04, 20.33)
(21.12, 19.66)
如果出于某种原因zip()
不能令人满意,通常要最简单的方法是编写实际的代码结构,然后压缩它,以进行列表理解。开头:
cols = []
for index, item in enumerate(allrows[0]):
col = []
for row in allrows:
col.append(row[index])
cols.append(col)
print(cols)
我们得到了想要的
[['NEPW46486','NEPW89344'],['NEPW46550','NEPW89346'],['sersic','sersic'],[20.04,20.33],[21.12,19.66]]
因此,我们可以将其压缩为一行,例如:
cols = [[row[index] for row in allrows] for index, item in enumerate(allrows[0])]
print(cols)
再次产生:
[['NEPW46486','NEPW89344'],['NEPW46550','NEPW89346'],['sersic','sersic'],[20.04,20.33],[21.12,19.66]]
答案 2 :(得分:0)
如果只需要一个元组列表,则只需执行以下操作:
list(zip(*allrows)) # python 3
或
zip(*allrows) # python 2