如何从值最接近z的列表中找到两个索引

2024-04-19 13:12:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为我的GA(实际上是适合度计算)写一篇文章,我需要从一个值最接近于零的列表中获取两个值的索引。我在网上找了大约一个小时,虽然看起来我已经非常接近了,而且看起来应该可以工作,但是用打印语句进行的测试表明我的代码不工作。。在

我现在的流程是:

  1. 找到最近的索引并存储它
  2. 从原始数组中删除它
  3. 找到最近的

以下是相关代码:

closest = min(range(len(fitness_levels)), key=lambda i: abs(fitness_levels[i]-0))
fitness_levels.pop(closest)
second_closest = min(range(len(fitness_levels)), key=lambda i: abs(fitness_levels[i]-0))

fitness_levels = [-20, 23, -55, 11, 10, -18, -48, 16, -60, 20, 22, 16, 21, 66, 10, 46, -42]被授予时,这些数字是完全随机生成的。在

就像我说的,当我对print语句进行一些检查时,我发现这个方法在多个方面都不起作用,甚至在某一点上,我甚至得到了相同的索引不同的值。有没有人有更好的可行的方法来做到这一点?-python 2.7.x版

旁注-我来自一个php背景,仍然在热身python,所以有些语法可能是错误的。。。在


Tags: 方法lambdakey代码列表len文章range
3条回答

我会选择:

fitness_levels = [-20, 23, -55, 11, 10, -18, -48, 16, -60, 20, 22, 16, 21, 66, 10, 46, -42]

import heapq
closest2 = heapq.nsmallest(2, ((abs(val), idx) for idx, val in enumerate(fitness_levels)))
# [(10, 4), (10, 14)]
indices = [el[1] for el in closest2]
# [4, 14]

像这样:

>>> lis = [-20, 23, -55, 11, 10, -18, -48, 16, -60, 20, 22, 16, 21, 66, 10, 46, -42]
for i,x in enumerate(sorted(enumerate(lis), key=lambda x:abs(0 - x[1]))[:2]):
    x = list(x)
    x[0] -= i    #reduce index as an item was removed from the list
    ind, val = x
    print "{}->{}".format(ind, val)
...     
4->10
13->10

如果您不想减少索引,那么只要这样就足够了:

^{pr2}$

使用abs键进行排序时,这是一个nlogn解决方案。这是一个线性解

fitness_levels = [-20, 23, -55, 11, 10, -18, -48, 16, -60, 20, 22, 16, 21, 66, 10, 46, -42]
a,b = sorted(fitness_levels[:2], key=abs) # setting defaults. a<=b
ia, ib = 0,1 # indices
for i,val in enumerate(fitness_levels[2:]): # use itertools.islice for large lists (for constant space)
  if abs(val) < abs(a):
    b,a = a,val
    ib, ia = ia, i
  elif abs(val) < abs(b):
    b = val
    ib = i

相关问题 更多 >