几天后我就遇到了问题。我有100个不同的时间文件夹,每个文件夹包含11个sensor1.dat,sensor2.dat等文件。
sensor1.dat
的示例x1,x2,x3
1,2,3
4,5,6
7,8,9
我试图循环遍历所有时间文件夹并加载每个时间步传感器文件的最后一行
结果可能是嵌套列表: 外部列表包含时间数据 - 每个时间数据的内部列表所有sensor_data,这意味着:外部列表100行,内部列表每行外行11行。
因此我尝试了以下内容:
def getData():
for TIME in TIMES:
cd_string = TIME
cd_string = string.replace(cd_string,'\n','')
os.chdir(cd_string)
print(TIME)
i_sensors=11
data=[]
for i in xrange(1,i_sensors+1):
#print i
sensor_string='../../sets/'+cd_string+'/w_z_sensor_'+str(i)+'_U.dat'
data_input = np.genfromtxt(sensor_string, delimiter="," , skip_header=1)
data.append(data_input[-1,:])
os.chdir('../')
return data
######MAIN####
TIMES = os.popen("ls -d 0.31* ").readlines()
zw=[[]] #*len(TIMES)
for i in xrange(0,len(TIMES)):
zw[i].append(getData())
函数getData工作正常,我获取了每个时间步的传感器文件所需的所有数据,
问题是主要部分。在这里,我试图为每个时间文件夹附加传感器数据。这不起作用。使用未注释的z = [[]] * len(TIMES),它只复制100行数据
我的问题在哪里?
提前建议和感谢?
答案 0 :(得分:0)
与jonrsharpe提到的一样,您的问题是当您使用*
运算符创建列表时,内部实际上创建了大量列表位置,并将您提供的列表中的元素复制到新列表索引。如果列表包含引用对象,则它复制引用而不是复制引用的内容,因此如果您对一个位置中的任何引用进行任何更改,它将反映在所有其他位置。
示例 -
>>> lst = [[1]] * 10
>>> lst
[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
>>> lst[0][0] = 5
>>> lst
[[5], [5], [5], [5], [5], [5], [5], [5], [5], [5]]
您应该尝试使用列表理解初始化列表 -
示例 -
>>> lst = [[1] for _ in range(10)]
>>> lst
[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
>>> lst[0][0] = 5
>>> lst
[[5], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
在你的情况下 -
zw=[[] for _ in range(len(TIMES))]