从另一个列表中获取项目的边界

时间:2011-08-15 20:36:04

标签: python

我有一个类似的列表,

tlist = [0.0, 0.07, 0.13, 0.15, 0.2, 0.22] (which is sorted)

我有另一个列表,

newlist = [0.0, 0.04, 0.08, 0.12, 0.16, 0.2] (numbers with a difference of 0.04)

我必须浏览第二个列表中的每个项目,并检查该数字所在的边界(tlist中的两个数字之间)。

如果我从第二个列表中检查第一个项目是“0.0”,那么它就在第一个列表中的“0.0”和“0.07”之间。

类似地,第二个列表中的下一个项目“0.04”在第一个文件中再次介于“0.0”和“0.07”之间。

因此,对于从第二个列表中检查的每个项目,它应该知道它的边界。它应该设定界限。结果可能是,'0.0'的范围是x到y,其中x = 0.0,y = 0.07。

如果tlist中的数字与新列表中的某个数字完全相同,那么程序应该忽略它,或者它可以打印“无边界可能”之类的语句并继续下一个数字。

如何将其放入代码中。谢谢。

8 个答案:

答案 0 :(得分:4)

使用enumerate的简单方法:

for n in newlist:
    for i, t in enumerate(tlist):
        if t > n:
            # found upper boundry, previous must be equal or lower
            upper, lower = t, tlist[i-1]
            break
    print lower, n, upper

答案 1 :(得分:2)

有点简单,假设tlist已排序

def find_interval(tlist, item):
    for lower, upper in zip(tlist[:-1], tlist[1:]):
        if lower <= item < upper:
            return (lower, upper)
    return None # Or raise some "IntervalNotFoudException"

print((find_interval(tlist, item) for item in newlist))

编辑:使用zip

缩短时间

答案 2 :(得分:2)

>>> tlist = [0.0, 0.07, 0.13, 0.15, 0.2, 0.22]
>>> newlist = [0.0, 0.04, 0.08, 0.12, 0.16, 0.2]
>>> def getrange(x):
...     for i in range(len(tlist)):
...         if tlist[i] > x:
...             return tlist[max(0, i-1)], tlist[i]
>>> [getrange(x) for x in newlist]
8: [(0.0, 0.07),
 (0.0, 0.07),
 (0.07, 0.13),
 (0.07, 0.13),
 (0.15, 0.2),
 (0.2, 0.22)]

这有帮助吗?

答案 3 :(得分:2)

您可以使用bisect模块:

import bisect
def bisect_range(sortedlist, tofind):
    for t in tofind:
        loc = bisect.bisect_right(sortedlist, t)
        yield (sortedlist[loc-1], sortedlist[loc])

tlist = [0.0, 0.07, 0.13, 0.15, 0.2, 0.22]
newlist = [0.0, 0.04, 0.08, 0.12, 0.16, 0.2]
print list(bisect_range(sorted(tlist), newlist))

这是 O(N * log(M))其中M是排序列表的长度,N是被搜索项目的长度,因为bisect_right函数是 O(log(M))我们为长度为N的搜索列表中的每个项目调用一次。对初始列表进行排序(如果它尚未排序)是 O(M *日志(M))

答案 4 :(得分:2)

使用您在问题Unexpected output from Newton's method中发布的代码,此处time函数与边界正确匹配:

def time() :
    t_u = 0
    i = 0
    while i < len(tlist) - 1:
        # if the number is in the range
        # do the calculations and move to the next number
        if t_u > tlist[i] and t_u < tlist[i + 1] :
            print "\n The t_u value:", t_u, 'is between',
            print "start:", tlist[i], " and end: ", tlist[i+1]
            poly = poly_coeff(tlist[i], tlist[i + 1], t_u)
            Newton(poly)
            t_u = t_u + 0.04 # regular time interval
        # if the number is at the boundary of the range
        # go to the next number without doing the calculation
        elif t_u == tlist[i] or t_u == tlist[i + 1] :
            print "\n The t_u value:", t_u, 'is on the boundary of',
            print "start:", tlist[i], " and end: ", tlist[i+1]
            t_u = t_u + 0.04 # regular time interval
        # if the number isn't in the range, move to the next range
        else :
            i += 1

答案 5 :(得分:1)

如果您的First Array已排序,这应该非常简单。对于数组2中的每个数字(称为'z'),迭代一次通过数组1并找到具有最小索引的值,该值小于z。这是你的x。然后找到数组1中值的最小索引,该索引大于或等于'z'。这是你的。

希望有所帮助。如果您需要更多解释,请告诉我。编码这不应该是一个大问题。如果您在编写代码时遇到困难,我可以帮助您解决问题。

由于 Shaunak

答案 6 :(得分:1)

tlist = [0.0, 0.07, 0.13, 0.15, 0.2, 0.22]
newlist = [0.0, 0.04, 0.08, 0.12, 0.16, 0.2]

for n in newlist:
    print n
    for i in xrange(len(tlist) - 1):
        if tlist[i] <= n < tlist[i + 1]:
            print tlist[i], tlist[i + 1]
            break
    else:
        print "Not found"
    print ""

这打印出以下内容:

0.0
0.0 0.07

0.04
0.0 0.07

0.08
0.07 0.13

0.12
0.07 0.13

0.16
0.15 0.2

0.2
0.2 0.22

假设:我假设您希望包含下限,而不是上限,我假设您的tlist已排序。

答案 7 :(得分:0)

许多解决方案......这里是使用迭代器的解决方案:

tlist = [0.0, 0.07, 0.13, 0.15, 0.2, 0.22]
newlist = [0.0, 0.04, 0.08, 0.12, 0.16, 0.2]

def range_finder(a,b):
  iter_a = iter(a)
  lower_a, upper_a = iter_a.next(), iter_a.next()
  for item in b:
    while True:
      if lower_a <= item < upper_a:
        print "%s is %s to %s" % (item,lower_a,upper_a)
        break
      else:
        lower_a = upper_a
        upper_a = iter_a.next()

range_finder(tlist,newlist)

产:

0.0 is 0.0 to 0.07
0.04 is 0.0 to 0.07
0.08 is 0.07 to 0.13
0.12 is 0.07 to 0.13
0.16 is 0.15 to 0.2
0.2 is 0.2 to 0.22