3

我有一个排序的浮点数列表y,以及一个未排序的浮点数列表x

现在,我需要找出每个元素的值位于x哪个值之间y,最好是通过y. 例如,如果

y=[1,2,3,4,5]

x[0]=3.5 

我需要输出to的索引0,因为介于and之间。x(2,3)3.5y[2]y[3]

基本上,我猜这与查看ybin 边缘和对这些 bin 进行排序是一样的。x

实现这一目标的最简单方法是什么?

4

3 回答 3

6

我会使用zip(itertools.izip在 Python 2.x 中) 来完成这个:

from itertools import islice#, izip as zip # if Python 2.x

def nearest_neighbours(x, lst):
    for l1, l2 in zip(lst, islice(lst, 1, None)):
        if l1 <= x <= l2:
            return l1, l2
    else:
        # ?

示例用法:

>>> nearest_neighbours(3.5, range(1, 6))
(3, 4)

如果你想要索引(尽管你的例子没有使用它们),你将不得不决定你想要发生的事情,如果x不是在任何对之间lst(即替换!),玩一下.# ?enumerate

于 2014-05-19T15:30:10.573 回答
1

谢谢 - 我知道如何一步一步地编写代码。但是,我一直在寻找一个漂亮/简单/优雅的解决方案,现在我正在使用 numpy.digitize(),这对我来说看起来很漂亮并且效果很好。

于 2014-05-23T13:31:13.033 回答
0

问:你实现这一目标的最简单方法是什么?

与其给你代码,我认为你应该看到这个伪代码并尝试编写你自己的代码!如果您想自学,不要只是从互联网上复制粘贴代码!

伪代码:

// Assume that when you have a tie,
// you put the number in the smallest range
// Here, b is between 2.1 and 3.5, instead of
// 3.5 and 4.1
float a[5] = {0.1, 1.1, 2.1, 3.5, 4.1}; // your y
float b = 3.5;                          // your x

// counter for the loop and indexes. Init i to second element
integer i = 1, prev = -1, next;

// while we are not in the end of the array
while(i < 5) {
    // if b is in the range of ( a(i-1), a(i) ]
    if(b <= a[i] && b > a[i - 1]) {
    // mark the indexes
        prev = i - 1;
        next = i;
    }

    // go to next element
    i++;
}

if(prev = -1)
    print "Number is not between some numbers"
else
    print "prev, next"

我认为这可以让你理解这一点,然后能够为你选择最简单的方法。

于 2014-05-21T14:22:15.713 回答