Python 3.x 将数据读入两个单独的列表
我刚开始学习python,想知道如何将一组点读入两个不同的列表(比如p和q) 我想要像这样的东西Python 3.x 将数据读入两个单独的列表,python-3.x,Python 3.x,我刚开始学习python,想知道如何将一组点读入两个不同的列表(比如p和q) 我想要像这样的东西 p=[1.0,2.0,6.0,14.0]和q=[4.0,3.0,5.0,3.0]最简单的方法是: lines = open('your_file.txt').read().splitlines() p = [line.split(',')[0] for line in lines] q = [line.split(',')[1] for line in lines] 尽管语法可读性很高,但不建议
p=[1.0,2.0,6.0,14.0]
和q=[4.0,3.0,5.0,3.0]
最简单的方法是:
lines = open('your_file.txt').read().splitlines()
p = [line.split(',')[0] for line in lines]
q = [line.split(',')[1] for line in lines]
尽管语法可读性很高,但不建议像这样进行迭代,因为这样做效率不高。一次过在线路上循环将是一个良好的开端:
for line in open('your_file.txt').read().splitlines():
p.append(line.split(',')[0])
q.append(line.split(',')[1])
但是,如果您想使用可读性较差但效率较高且可扩展的oneliner,请参阅:
p,q = map(list,zip(*[line.split(',') for line in open('your_file.txt').read().splitlines()]))
计时:(将您的文件放大到其数据的30倍)
返回:151µs±19µs/循环(7次运行的平均值±标准偏差,每个循环10000次)
二,
返回:149µs±47.1µs/循环(7次运行的平均值±标准偏差,每个循环10000次)
三,
返回:105µs±2.54µs/循环(7次运行的平均值±标准偏差,每个循环10000次)
虽然numpy和其他库可能是一个更快的选择,如果您有很多操作,但在像这样的简单情况下,它们将花费您更多,而不是任何效率,因为它们不打算用于这样简单的任务:
%%timeit
f = np.loadtxt('your_file.txt', delimiter=',')
p, q = f[:,0], f[:,1]
p,q
返回:
920µs±38.9µs/循环(7次运行的平均值±标准偏差,每个循环1000次)
这里是一种替代单线解决方案。.T
转换由np.loadtxt
返回的数组,以便您可以将其解压为两个(或txt文件中的任意列数)
将numpy导入为np
p、 q=np.loadtxt('data.txt',分隔符=',').T
数据文件定义为
1.0,4.0
2.0,3.0
6.0,5.0
14.0,3.0
编辑
我最近在中发现,您还可以将unpack
关键字设置为True
,以便以更简洁的方式执行相同的操作:
p,q=np.loadtxt('data.txt',分隔符=',',unpack=True)
数据表的数据结构是什么?它是数据帧吗?或numpy数组?第二个列表中的每个数字后面都会出现一个“\n”。有没有办法解决这些问题?事实上,这是做同样事情最昂贵的方法,而不是最简单的方法。为什么在读取完整数据后需要对其进行两次迭代?这种解决方案效率很低。如果要读取行,则只需一次性将值附加到p和q上即可。另外,由于变量名中存在错误,代码无法运行。@amitmishra请不要将效率低下且有错误的答案标记为正确答案。其他寻找类似问题的SO用户最终得到了糟糕的解决方案,SO的整体质量受到影响。感谢Akshey指出!我更新了我的答案!
%%timeit
for line in open('your_file.txt').read().splitlines():
p.append(line.split(',')[0])
q.append(line.split(',')[1])
%%timeit
p,q = map(list,zip(*[line.split(',') for line in open('your_file.txt').read().splitlines()]))
%%timeit
f = np.loadtxt('your_file.txt', delimiter=',')
p, q = f[:,0], f[:,1]
p,q
1.0,4.0
2.0,3.0
6.0,5.0
14.0,3.0