在 python 中以编程方式附加列表
Appending lists programmatically in python
我在以编程方式附加两个列表时遇到了一些问题。我想知道点列表是位于边上还是位于多边形内部(它们不能位于外部)。我所拥有的是:
'pedges' 是在 Abaqus 中形成闭合多边形的边列表
'areas' 是 'floats'
的列表
有一个名为 getDistance
的内置函数,我确信它运行良好(来自 Abaqus)
a) 如果一个点位于边缘,那么这个位置的面积将被添加到 areas_onEdge=[]
b) 如果一个点不在边缘,那么这个位置的区域被添加到 areas_inside=[]
最后我计算sum(areas_inside)/areaShell
我尝试了一些直接的代码,但它不起作用。
我做错了什么?
areaShell=368.97;
areas_onEdge=[]
areas_inside=[]
points=[(923.9,562.0244,0),(923.9,570.8333,0),(914.1,568.6853,0),(923.9,554.1,0),(928.8,568.6853,0),(919,579.2,0)]
areas=[787.2464,368.97,73984.02,42012.99,73984.02,44627.33]
print 'points Inter '.join(map(str,points));
print 'Areas Inter '.join(map(str,areas));
for i in range(0,len(areas)-1):
if p.getDistance(points[i],pedges[i])< 0.0001: #Distance between a point and an edge
areas_onEdge.append(areas[i])
else:
areas_inside.append(areas[i])
result=sum(areas_inside)/areaShell
已编辑
基于马修斯的回答:
for i in range(len(areas)):
is_on_edge = False
for j in range(len(pedges)):
if p.getDistance(points[i], pedges[i]) < 0.0001:
areas_onEdge.append(areas[i])
is_on_edge = True
if not is_on_edge:
areas_inside.append(areas[i])
是否可以像这样压缩三个列表以获得比率 'ratt'?
for point, area,areaR in zip(pointsInter_proj, areasInter,areasRev):
edges_distances = [p.getDistance(point, pedge) for pedge in pedges]
if min(edges_distances) >=0:
ratt.append(area/areaR);
你的问题可能出在for循环上。
首先,您没有遍历所有区域,因为您的范围最多只达到 len(areas)-1
。在 Python 中,范围的结束分隔符不包含在生成的列表中,例如,range(0, 5)
生成列表 [0, 1, 2, 3, 4]
.
此外,您只是将每个点与一条边进行比较,据我所知,您想将一个点与所有边进行比较。
这个循环纠正了我在这里提出的两点:
for i in range(len(areas)):
is_on_edge = False
for j in range(len(pedges)):
if p.getDistance(points[i], pedges[j]) < 0.0001:
areas_onEdge.append(areas[i])
is_on_edge = True
break
if not is_on_edge:
areas_inside.append(areas[i])
这是做同样事情的另一种方式(在我看来更多 Pythonic):
for point, area in zip(points, areas):
edges_distances = [p.getDistance(point, pedge) for pedge in pedges]
if min(edges_distances) < 0.0001:
areas_onEdge.append(area)
else:
areas_inside.append(area)
我在以编程方式附加两个列表时遇到了一些问题。我想知道点列表是位于边上还是位于多边形内部(它们不能位于外部)。我所拥有的是:
'pedges' 是在 Abaqus 中形成闭合多边形的边列表
'areas' 是 'floats'
的列表
有一个名为
getDistance
的内置函数,我确信它运行良好(来自 Abaqus)a) 如果一个点位于边缘,那么这个位置的面积将被添加到
areas_onEdge=[]
b) 如果一个点不在边缘,那么这个位置的区域被添加到
areas_inside=[]
最后我计算
sum(areas_inside)/areaShell
我尝试了一些直接的代码,但它不起作用。
我做错了什么?
areaShell=368.97;
areas_onEdge=[]
areas_inside=[]
points=[(923.9,562.0244,0),(923.9,570.8333,0),(914.1,568.6853,0),(923.9,554.1,0),(928.8,568.6853,0),(919,579.2,0)]
areas=[787.2464,368.97,73984.02,42012.99,73984.02,44627.33]
print 'points Inter '.join(map(str,points));
print 'Areas Inter '.join(map(str,areas));
for i in range(0,len(areas)-1):
if p.getDistance(points[i],pedges[i])< 0.0001: #Distance between a point and an edge
areas_onEdge.append(areas[i])
else:
areas_inside.append(areas[i])
result=sum(areas_inside)/areaShell
已编辑
基于马修斯的回答:
for i in range(len(areas)):
is_on_edge = False
for j in range(len(pedges)):
if p.getDistance(points[i], pedges[i]) < 0.0001:
areas_onEdge.append(areas[i])
is_on_edge = True
if not is_on_edge:
areas_inside.append(areas[i])
是否可以像这样压缩三个列表以获得比率 'ratt'?
for point, area,areaR in zip(pointsInter_proj, areasInter,areasRev):
edges_distances = [p.getDistance(point, pedge) for pedge in pedges]
if min(edges_distances) >=0:
ratt.append(area/areaR);
你的问题可能出在for循环上。
首先,您没有遍历所有区域,因为您的范围最多只达到 len(areas)-1
。在 Python 中,范围的结束分隔符不包含在生成的列表中,例如,range(0, 5)
生成列表 [0, 1, 2, 3, 4]
.
此外,您只是将每个点与一条边进行比较,据我所知,您想将一个点与所有边进行比较。
这个循环纠正了我在这里提出的两点:
for i in range(len(areas)):
is_on_edge = False
for j in range(len(pedges)):
if p.getDistance(points[i], pedges[j]) < 0.0001:
areas_onEdge.append(areas[i])
is_on_edge = True
break
if not is_on_edge:
areas_inside.append(areas[i])
这是做同样事情的另一种方式(在我看来更多 Pythonic):
for point, area in zip(points, areas):
edges_distances = [p.getDistance(point, pedge) for pedge in pedges]
if min(edges_distances) < 0.0001:
areas_onEdge.append(area)
else:
areas_inside.append(area)