2017-06-22 60 views
0

我有一个相当不雅的嵌套循环来清理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]平坦化双重嵌套,但这似乎是一个非常糟糕的解决方案。从下面的CSV

[[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]]] 

输入数据:

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

用csv模块读取文件! – wim

+0

你能提供一个来自input1.csv的数据样本吗? –

+0

[这里](https://docs.python.org/2.7/library/csv.html)是让你开始的csv模块的文档。它看起来像你有像'1,2,3 \ t4,5,6 \ t \ n7,8,9'这样的数据,你是否考虑过用换行符替换所有的标签?这将有助于知道为什么数据格式化,因为它是 –

回答

0

正如在他的评论中提到的WIM额外的维度,这不你需要解决的事情!我把你的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模块不会尝试处理任何类型的转换。

+0

感谢您的详细解释! – user7875185

+0

后续问题 - 任何理由做你为转换为整数而不是:[[map(int,i)for csv.reader(open('input1.csv'))]''中显示的两种方法之一。不确定一个人是否更优雅? – user7875185

+0

阅读和维护列表理解几乎总是比较容易的,列表理解是“更pythonic”(由风格指南推荐)。如果这是另一种语言(用咖喱),地图可能看起来更优雅。在复杂度较高的情况下,嵌套循环更可取。 我添加了一个混合选项作为编辑,我认为这是最清晰和最明显的。 – Cireo

0

可以使用numpy的挤压除去对数组或列表

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()