python中的新功能,但我发现没有线程解决我的问题。
我有一大堆我正在进行后期处理的数据,它已存储在已经组织为字典的csv文件中。每个数据表示地图中的一个点,如果点在某个范围内,则该点从唯一点(质心)收集。有一个可能的质心列表及其坐标,其中质心始终遵循相同的顺序。在某些情况下,几个质心位于相同点的范围(50),所以我试图估计哪个是质心,它收集了每个点。以下代码成功计算了每个数据范围内的质心。
coordinates = ["41.49770104,-0.138334713","40.91960027,-1.841980944","40.86344385,-0.723219273"] #3 centroids as example
with io.open("Trips.csv", mode='r', encoding='latin-1') as csvfile:
reader = csv.reader(csvfile, delimiter=",", quotechar="\"", quoting=csv.QUOTE_ALL,dialect="excel")
for i, row in enumerate(reader):
label = ["Clat","Clong","Cradius"] #Centroid coordinates and distance to current dot
result = []
finalresult = []
newlines = []
if i != 0: #For avoiding 1st row (header)
for centroid in coordinates:
latitude = float(centroid.split(',')[0])
longitude = float(centroid.split(',')[1])
radius = haversine(longitude, latitude, float(row[12]), float(row[11])) #Formula not relevant for this case.Distance between points. Type: Float
if radius < 50: #Condition to consider a centroid
result = [latitude,longitude,radius]
a = dict(zip(label,result))
finalresult.append(a)
else:
continue
newlines = [row, finalresult] #New datum including possible centroids per datum
由于具有质心的列表始终遵循相同的顺序,并且该顺序用于收集数据,我的想法是找到只有1个可能的质心的数据。然后,如果下面有几个可能的质心,那么从那一行向前移动,并且它们中的任何一个等于前一个,那么一个将是正确的。如果没有,那么如果可用,将选择列表中的以下质心,依此类推。同样的过程倒退了。
但是,由于我没有立即读取所有数据框(如在循环中),我看不到比较行的方法并应用此条件。由于数据库非常大,因此创建具有质心结果的新csv文件是不可行的。有没有办法比较两行包括上述算法?我查看了itertools和函数next(),但后者在这种情况下不起作用:(“TypeError:'list'对象不是迭代器”)。考虑具有2个质心的行:
if len(newlines[1]) == 1: #Only 1 suitable centroid
print(centroid)
else: #Several available centroids
finalresult2=[]
for centroid in coordinates:
latitude = float(centroid.split(',')[0])
longitude = float(centroid.split(',')[1])
radius = haversine(longitude, latitude, float(next(row)[12]), float(next(row)[11])) #next row
if radius < 50:
result = [latitude, longitude, radius]
b = dict(zip(label, result))
finalresult2.append(b)
else:
continue
nextline = [row, finalresult2] #next row'results
for c in finalresult: #Check if the common value
if c in finalresult2:
print(c) #Take the common value and apply it to the previous row
为什么下一个不能适用于此列表?如果下面的行与它们有共同的值,是否有任何方法可以在循环编辑行中向后播放?