如何使用前两个维度的csv文件制作3D列表?

时间:2017-01-29 03:14:29

标签: python python-3.x

我对python并不是很熟悉,所以谷歌搜索和教育猜测让我尝试了一个列表推导解决方案,但我想象的格式有问题。这行给了我一个语法错误,所以有没有办法解决它?

    3dCSV = [[0 for _ in range(2)]list(csv.reader(open(sys.argv[1])))]

任何帮助将不胜感激,谢谢!

csv实际上只是一个二维数组。

示例:

    9 4 3 5 4
    3 9 4 7 2
    4 1 6 3 4
    3 4 8 2 8

只是想在其上添加第三个维度来保存0或1(基本上是一个布尔值),这样我就可以测试list[a][b][0]并根据我得到的输出,在{{1中放置0或1 }}。我不确定如何提供更好的例子?

3 个答案:

答案 0 :(得分:0)

这是一个简短的例子,它只是从文件中读取行,在空白处拆分它们并将每个项目转换为配对[int, None]

import pprint

with open('source.csv') as f:
    res = [[[int(x), None] for x in row.split()] for row in f]

res[1][2][1] = (res[1][2][0] % 2 == 0)
pprint.pprint(res)

输出:

[[[9, None], [4, None], [3, None], [5, None], [4, None]],
 [[3, None], [9, None], [4, True], [7, None], [2, None]],
 [[4, None], [1, None], [6, None], [3, None], [4, None]],
 [[3, None], [4, None], [8, None], [2, None], [8, None]]]   

在上面for row in f中,只需逐个读取文件中的行:

>>> rows = [row for row in f]
>>> rows
['9 4 3 5 4\n', '3 9 4 7 2\n', '4 1 6 3 4\n', '3 4 8 2 8\n']

然后for x in row.split()使用str.split在每个空格处拆分行:

>>> rows = [[x for x in row.split()] for row in f]
>>> rows
[['9', '4', '3', '5', '4'], ['3', '9', '4', '7', '2'], ['4', '1', '6', '3', '4'], ['3', '4', '8', '2', '8']]

由于我们希望在最终结果中使用[int, None]元素而不是字符串,因此我们会相应地转换每个元素:

>>> rows = [[[int(x), None] for x in row.split()] for row in f]
>>> print(*rows, sep='\n')
[[9, None], [4, None], [3, None], [5, None], [4, None]]
[[3, None], [9, None], [4, None], [7, None], [2, None]]
[[4, None], [1, None], [6, None], [3, None], [4, None]]
[[3, None], [4, None], [8, None], [2, None], [8, None]]

答案 1 :(得分:0)

这是你想要的吗?因此,每当你调用3dcsv [a] [b]时,无论你设置它还是会回复真或假。要将所有内容更改为False,只需将True替换为False:

import csv
filename='something.csv' #Enter your filename
with open(filename, 'r') as csvfile:
    _3dcsv = list(csv.reader(csvfile))

for index, i in enumerate(_3dcsv):
    for index2, e in enumerate(i):
        _3dcsv[index][index2]={e:True} #or false

输出:

[[{'1': True}, {'2': True}, {'3': True}, {'4': True}, {'5': True}],
 [{'4': True}, {'5': True}, {'2': True}, {'3': True}, {'5': True}],
 [{'4': True}, {'5': True}, {'6': True}, {'7': True}, {'1': True}]]

答案 2 :(得分:0)

如果您要处理很多CSV文件和数组样式数据,那么您应该查看numpy这是python的数组/数学库。安装它和python的最简单方法是从https://www.continuum.io/downloads安装 Anaconda Python发行版

安装了numpy的

执行此操作:

import numpy as np

您需要指定数据类型(int表示整数或浮点数 如果您的数字不浮动,则浮点数是默认值。

arr2d = np.loadtxt(sys.argv[1], dtype=int)
print(arr2d)

输出:

array([[9, 4, 3, 5, 4],
       [3, 9, 4, 7, 2],
       [4, 1, 6, 3, 4],
       [3, 4, 8, 2, 8]])

现在创建一个相同形状的布尔数组,其中所有值都大于3(作为示例。

arrbool = arr2d > 3
print(arrbool)

输出

[[ True  True False  True  True]
 [False  True  True  True False]
 [ True False  True False  True]
 [False  True  True False  True]]

使用arrbool数组作为掩码,仅设置True位置的值 一些数字(制作一个数组的副本,或者你将修改原文)。

arrcopy = arr2d.copy()
arrcopy[arrbool] = 1
print(arrcopy)

输出:

array([[1, 1, 3, 1, 1],
       [3, 1, 1, 1, 2],
       [1, 1, 1, 3, 1],
       [3, 1, 1, 2, 1]])