【问题标题】:python - filter minimum element for given conditionpython - 过滤给定条件的最小元素
【发布时间】:2016-04-23 16:33:23
【问题描述】:

从元组l 的列表中,我需要过滤距元组x 至少欧几里得距离的元素。

  1. 我可以使用 list comprehensionlambda function 来做到这一点吗?你可以拿l = [(0,0), (1,1), (2,3), (3,4), (4,5)]x=(3,0)

  2. 假设l中同时存在多个欧式距离最小的元素。然后我需要从 那些 元素中返回随机元素。这也可以使用列表推导或 lambda 函数来完成吗?

【问题讨论】:

  • 1) 是的。 2) 是的。你试过了吗?
  • @DisplayName 我不知道如何在一行中做到这一点。对于 3 行代码,是的,我有。

标签: python list lambda


【解决方案1】:

首先你应该定义一个函数来获取Euclidian distance。一种方法是将元组转换为复数并获得它们的绝对差。

>>> dist = lambda t1, t2: abs(complex(*t1) - complex(*t2))

或者,您可以定义自己的函数。这可能会更快,因为如果您只想找到具有最小距离的值,您实际上并不需要取平方根。 然后,您可以将该函数用作 min 内置函数的关键函数。

>>> l = [(0,0), (1,1), (2,3), (3,4), (4,5)]
>>> x = (3,0)
>>> min(l, key = lambda y: dist(y, x))
(1, 1)

如果您想获取所有最小值,您可以将该值存储在一个变量中,并使用列表推导来获取距离等于该值的所有值。

>>> m = min(dist(y, x) for y in l)
>>> [y for y in l if dist(x, y) == m]
[(1, 1)]

如果您想要其中的随机值,请使用random.choice

>>> random.choice(_)
(1, 1)

但是请注意,这种方法将迭代列表两次,并且还会计算每个值的距离两次 - 一次以找到(任何)最小值,然后再次将每个值与该最小值进行比较。如果性能很重要,你应该使用@Kasramvd的方法。

【讨论】:

  • 我只是想打高尔夫球。由于我的数据集很小,目前我不关心性能。
【解决方案2】:

这是一种使用字典的有效方法:

from operator import itemgetter
from random import choice

def find_mins(x, lst):
    x1, y1 = x
    result = {}
    for x2, y2 in lst:
        quad_dist = (x1 - x2)**2 + (y1 - y2)**2
        result.setdefault(quad_dist, []).append((x2, y2))
    return choice(min(result.items(), key=itemgetter(0))[1])

演示:

l = [(0,0), (1,1), (2, 2), (2,3), (3,4), (4,5)]
x = (3,0)

find_mins(x, l)
(1, 1)
find_mins(x, l)
(2, 2)
find_mins(x, l)
(2, 2)

此功能将根据您与目标点的距离对您的坐标进行分类,然后根据距离找到最小值并返回相对坐标列表,然后您可以使用random.choice() 来选择一个随机点。

【讨论】:

    猜你喜欢
    • 2020-10-31
    • 1970-01-01
    • 2017-06-27
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    相关资源
    最近更新 更多