Как сгруппировать близкие точки в списке в Python - PullRequest
1 голос
/ 12 апреля 2019

Я получаю список, используя понимание списка.lat говорят, что я получаю этот список, используя следующую строку кода:

quality, angle, distance = measurements[i]
new_data = [each_value for each_value in  measurements[i:i + 20] if angle <= each_value[1] <= angle + 30 and
                        distance - 150 <= each_value[2] <= distance + 150]

, где измерения - это большой набор данных, который содержит пару (качество, угол, расстояние).Исходя из этого, я получаю эти значения.

desired_list= [(1,2,3)(1,5,3),(1,8,3)(1,10,3),(1,16,3),(1,17,3)]]

Теперь, как я могу добавить новое условие в мое понимание списка, так что я получу значение, только если угол находится в пределах некоторогозначение смещения?скажем, если разница между двумя соответствующими углами меньше или равна 5, поместите их в требуемый список.

с этим условием мой список должен выглядеть так:

desired_list= [(1,2,3)(1,5,3),(1,8,3)(1,10,3)]

причина от 2 до 5, от 5 до 8, от 8 до 10, расстояние меньше или равно 5.

Но последние два пункта не учитываются, поскольку они нарушают условие после (1,10,3), и их не нужно проверять.

Как я могу этого достичь?пожалуйста, помогите мне

Note: it doesn't need to be in the same list comprehension. 

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

Вы упоминаете, что набор данных большой.В зависимости от размера вы хотите избежать создания нового списка с нуля и просто искать соответствующий индекс.

data = [(1,2,3), (1,5,3), (1,8,3), (1,10,3), (1,16,3), (1,17,3)]

MAXIMUM_ANGLE = 5

def angles_within_range(x, y):
    return abs(x[1] - y[1]) <= MAXIMUM_ANGLE

def first_angle_break_index():
    for i in range(len(data) - 1):
        if not angles_within_range(data[i], data[i+1]):
            return i+1

def valid_angles_list():
    return data[:first_angle_break_index()]

print(valid_angles_list())
1 голос
/ 12 апреля 2019

Если вы имеете в виду перемещение от начала до конца и прорыв, когда одна соседняя пара нарушает правило.
вот путь без list comprehension:

desired_list = [(1, 2, 3), (1, 5, 3), (1, 8, 3), (1, 10, 3), (1, 16, 3), (1, 17, 3)]
res = [desired_list[0]]
for a, b in zip(desired_list[:-1], desired_list[1:]):
    if abs(a[1] - b[1]) > 5:
        break
    res += [b]

print(res)

выход:

[(1, 2, 3), (1, 5, 3), (1, 8, 3), (1, 10, 3)]

если вы настаиваете на использовании list comprehension с перерывом, вот решение для записи последней пары:

res = [last.pop() and last.append(b) or b for last in [[desired_list[0]]] for a, b in 
zip([desired_list[0]] + desired_list, desired_list) if abs(a[1] - b[1]) <= 5 and a == last[0]]

другая версия использует end условие:

res = [b for end in [[]] for a, b in zip([desired_list[0]] + desired_list, desired_list) if 
(False if end or abs(a[1] - b[1]) <= 5 else end.append(42)) or not end and abs(a[1] - b[1]) <= 5]

Примечание: это плохая идея. (просто для удовольствия:))

...