在嵌套循环中排除列表理解中的额外列表
我有一个相当不雅的嵌套循环来清理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
正如在他的评论中提到的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
模块不会尝试处理任何类型的转换。
感谢您的详细解释! – user7875185
后续问题 - 任何理由做你为转换为整数而不是:[[map(int,i)for csv.reader(open('input1.csv'))]''中显示的两种方法之一。不确定一个人是否更优雅? – user7875185
阅读和维护列表理解几乎总是比较容易的,列表理解是“更pythonic”(由风格指南推荐)。如果这是另一种语言(用咖喱),地图可能看起来更优雅。在复杂度较高的情况下,嵌套循环更可取。 我添加了一个混合选项作为编辑,我认为这是最清晰和最明显的。 – Cireo
可以使用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()
用csv模块读取文件! – wim
你能提供一个来自input1.csv的数据样本吗? –
[这里](https://docs.python.org/2.7/library/csv.html)是让你开始的csv模块的文档。它看起来像你有像'1,2,3 \ t4,5,6 \ t \ n7,8,9'这样的数据,你是否考虑过用换行符替换所有的标签?这将有助于知道为什么数据格式化,因为它是 –