Python 如何为前两个维度使用csv文件制作3D列表?
我对python不是很熟悉,所以谷歌搜索和有教养的猜测让我尝试了一个列表理解解决方案,但我认为我的格式有问题。这一行给了我一个语法错误,那么有办法修复它吗Python 如何为前两个维度使用csv文件制作3D列表?,python,python-3.x,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 我只想在上面添加
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]
,根据我得到的输出,将0或1放入list[a][b][1]
。我真的不知道如何给出一个更好的示例?这里有一个简短的示例,它只是从文件中读取行,在空白处拆分,并将每个项转换为成对的[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]]]
在上面的中,对于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']
然后,对于行中的x.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]]
这是你想要的吗?因此,无论您何时调用3dcsv[a][b],它都会以您设置的任何方式回复True或False。要将所有内容更改为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}]]
如果您要处理大量CSV文件和数组样式的数据,那么您应该查看哪一个是python的数组/数学库。安装它和python的最简单方法是从 安装numpy后,请执行以下操作:
import numpy as np
您需要指定数据类型(int表示整数或float表示整数)
如果您的数字不是浮动的,则默认为浮动
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]])
array([[1, 1, 3, 1, 1],
[3, 1, 1, 1, 2],
[1, 1, 1, 3, 1],
[3, 1, 1, 2, 1]])
现在创建一个形状相同的布尔数组,其中所有值都大于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数组作为掩码,仅在真位置设置值
到某个数字(复制数组或修改原始数组)
产出:
array([[9, 4, 3, 5, 4],
[3, 9, 4, 7, 2],
[4, 1, 6, 3, 4],
[3, 4, 8, 2, 8]])
array([[1, 1, 3, 1, 1],
[3, 1, 1, 1, 2],
[1, 1, 1, 3, 1],
[3, 1, 1, 2, 1]])
你好:)很难确定目的。。。你能举例说明你的csv的一行应该是什么样子吗?请提供csv示例和预期结果,因为它不可能提供有意义的答案。不知道你想做什么,请提供一个示例你运行代码了吗?不能以十进制数字开头,csv使用
,
作为默认分隔符。@niemmi抱歉,我在这里发布时更改了名称,因为@Kalahira使用了这个名称。我完全忘记了它,我用自己的变量名运行了代码,所以它工作了。