如何迭代Python列表并删除类似的元素?

2024-10-01 00:14:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本代表圆心和半径的词典。你知道吗

[{centre:(743,1105), radius: 41},
 {centre:(743, 1106), radius: 48},
 {centre:(899, 1443), radius: 48},
 {centre:(900, 1442), radius: 40}]

我想移除基于x轴位置的闭合圆。如果两个圆的x轴之差大于0小于3,则半径较大的圆将被删除。你知道吗

def takeXAxis(input):
    return input['centre'][0]


def sortCircles(circleDetails):
    circleDetails.sort(key=takeXAxis)


def removeClosedCircle(circleDetails):
    newCircleDetails = []
    for i in range(len(circleDetails)):
        j = i + 1
        for j in range(len(circleDetails)):
            ...

我对Python非常陌生,不知道如何完成它。你知道吗

添加

这是我希望得到的结果:

[{centre:(743,1105), radius: 41},
 {centre:(900, 1442), radius: 40}]

将对每个元素进行比较。例如:

0<;=| 743-743 |<;=3,48>;41,因此将删除第二个。你知道吗

| 743-899 |>;=3,| 743-900 |>;=3,这里什么都不会发生。你知道吗

0<;=| 899-900 |<;=3,48>;40,因此将删除第三个。你知道吗

已更新

这就是我想出的解决办法。但是速度很慢。有人知道如何优化它吗?你知道吗

def takeXAxis(input):
    return input['centre'][0]

def removeaAdjacentCircle(circleDetails):
    circleDetails.sort(key=takeXAxis)
    newCircleDetails = []
    indexOfRemovedCircle = []
    for i in range(0, len(circleDetails)):
        if i in indexOfRemovedCircle:
            continue
        for j in range(i + 1, len(circleDetails)):
            delta = abs(circleDetails[i]['centre'][0] - circleDetails[j]['centre'][0])
            if 0 <= delta <= 3:
                if circleDetails[i]['radius'] - circleDetails[j]['radius'] >= 0:
                    indexOfRemovedCircle.append(i)
                else:
                    indexOfRemovedCircle.append(j)

    for i in range(0, len(circleDetails)):
        if i in indexOfRemovedCircle:
            continue
        newCircleDetails.append(circleDetails[i])

    return newCircleDetails

Tags: inltgtforinputlenifdef
1条回答
网友
1楼 · 发布于 2024-10-01 00:14:54

使用itertools.combinations()。我相信它比嵌套循环更有效。你知道吗

import itertools

my_list = [
    {'centre':(743,1105), 'radius': 41},
    {'centre':(743, 1106), 'radius': 48},
    {'centre':(899, 1443), 'radius': 48},
    {'centre':(900, 1442), 'radius': 40}
]

for a, b in itertools.combinations(my_list, 2):

    # only need to do something if the diff is in range..
    if abs(a['centre'][0] - b['centre'][0]) <= 3:

        # check the radius, if bigger, remove it, else remove the other.
        if a['radius'] > b['radius']:
            my_list.remove(a)
        else:
            my_list.remove(b)

print my_list

我已经发表了一些评论来说明这一点。如果你想知道什么,尽管问。你知道吗

希望能有帮助:)

相关问题 更多 >