我有一个类似的列表,
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中的数字与新列表中的某个数字完全相同,那么程序应该忽略它,或者它可以打印“无边界可能”之类的语句并继续下一个数字。
如何将其放入代码中。谢谢。
答案 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