以编程方式在python中添加列表

时间:2016-02-26 12:39:15

标签: python list abaqus

我遇到了一些以编程方式附加两个列表的问题。我想找出一个点列表是放在边缘还是多边形内部(它们不能放在外面)。我有的是:

  1. 'pedges'是在Abaqus中形成闭合多边形的边列表

  2. 'areas'是'浮动'列表

  3. 我确信有一个名为getDistance的内置函数(来自Abaqus)

    a)如果一个点位于边缘,那么该位置的区域将被添加到areas_onEdge=[]

    b)如果一个点没有放在边缘上,那么此位置的区域将被添加到areas_inside=[]

  4. 最后我计算sum(areas_inside)/areaShell

  5. 我尝试了一些直接的代码,但它不起作用。

    我做错了什么?

    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
    

    EDITED

    基于马修斯回答:

    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);
    

1 个答案:

答案 0 :(得分:0)

可能你的问题在于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)