使用嵌套循环去除列表推导中的额外列表

时间:2017-06-22 01:46:43

标签: python python-2.7 list-comprehension nested-loops

我有一个非常不优雅的嵌套循环来清理csv中的数据 - 是否有更好/更pythonic的方式来完成下面的操作?

data = [[map(int, i.split(',')) for i in (item.strip() 
                                for item in line.rstrip('\n').split('\t'))][0] 
                                for line in open('input1.csv')]

output: [[8, -11, 1], [7, 7, -1], [12, -20, 1], [14, -3, -1], [12, 8, -1], [1, -12, 1], [15, 5, -1], [7, -10, 1], [10, 4, -1], [6, 2, 1], [8, 12, -1], [2, 20, -1], [1, -12, 1], [9, 8, -1], [3, 3, 1], [5, 6, 1], [1, 11, 1]]

特别是,在第二个for循环中,我调用最后一个for循环创建的列表的索引0(不确定这是正确的术语?)。最初我有以下代码,但这产生了一个双重嵌套列表。我坚持使用[0]来压扁双重嵌套,但这似乎是一个非常糟糕的解决方案。

[[map(int, i.split(',')) for i in (item.strip() 
                         for item in line.rstrip('\n').split('\t'))] 
                         for line in open('input1.csv')]

output: [[[8, -11, 1]], [[7, 7, -1]], [[12, -20, 1]], [[14, -3, -1]], [[12, 8, -1]], [[1, -12, 1]], [[15, 5, -1]], [[7, -10, 1]], [[10, 4, -1]], [[6, 2, 1]], [[8, 12, -1]], [[2, 20, -1]], [[1, -12, 1]], [[9, 8, -1]], [[3, 3, 1]], [[5, 6, 1]], [[1, 11, 1]]]

从csv下面输入数据:

8,-11,1
7,7,-1
12,-20,1
14,-3,-1
12,8,-1
1,-12,1
15,5,-1
7,-10,1
10,4,-1
6,2,1
8,12,-1
2,20,-1
1,-12,1
9,8,-1
3,3,1
5,6,1
1,11,1

2 个答案:

答案 0 :(得分:0)

您可以使用numpy squeeze删除数组或列表中的额外维度

import numpy as np
np.squeeze([[map(int, i.split(',')) for i in (item.strip() 
                         for item in line.rstrip('\n').split('\t'))] 
                         for line in open('input1.csv')]).tolist()

答案 1 :(得分:0)

正如他在评论中提到的那样,这不是你需要自己解决的问题!我把你的csv写到一个名为eg.csv的文件中,然后......

>>> import csv
>>> list(csv.reader(open('eg.csv')))
[['8', '-11', '1'], ['7', '7', '-1'], ['12', '-20', '1'], ['14', '-3', '-1'], ['12', '8', '-1'], ['1', '-12', '1'], ['15', '5', '-1'], ['7', '-10', '1'], ['10', '4', '-1'], ['6', '2', '1'], ['8', '12', '-1'], ['2', '20', '-1'], ['1', '-12', '1'], ['9', '8', '-1'], ['3', '3', '1'], ['5', '6', '1'], ['1', '11', '1']]

如果你想让它们成为整数,你可以这样做:

>>> [[int(col) for col in row] for row in csv.reader(open('eg.csv'))]
# or
>>> map(lambda x: map(int, x), csv.reader(open('eg.csv')))
# or
>>> [map(int, row) for row in csv.reader(open('eg.csv'))]
# to get
[[8, -11, 1], [7, 7, -1], [12, -20, 1], [14, -3, -1], [12, 8, -1], [1, -12, 1], [15, 5, -1], [7, -10, 1], [10, 4, -1], [6, 2, 1], [8, 12, -1], [2, 20, -1], [1, -12, 1], [9, 8, -1], [3, 3, 1], [5, 6, 1], [1, 11, 1]]

不幸的是,内置csv模块不会尝试处理任何类型的转换。