Как перебрать список Python и удалить похожий элемент? - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть список словаря, который представляет центр и радиус окружности.

[{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

1 Ответ

0 голосов
/ 30 ноября 2018

Использование 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

Я добавил комментарии, чтобы прояснить ситуацию.Не стесняйтесь спрашивать, нужно ли вам что-то знать.

Надеюсь, это поможет:)

...