列表理解可按列组合子列表的元素

时间:2019-05-15 21:27:11

标签: python python-3.x list list-comprehension nameerror

我有一个这样的列表列表:

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。我也尝试切换循环语句的顺序,但这并没有给我想要的输出(相反,它恰好给了我开始时的内容)。如何通过列表理解来实现所需的输出?

3 个答案:

答案 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
相关问题