在 Python 中查找介于 0-100 之间的值范围内的索引


这是一个

由两部分组成的问题,我必须通过列表中任意数量的整数的随机范围来选择 2 个索引。如果它们也在同一范围内,则无法返回两者

Selection1 = random.randint(0,100)
Selection2 = random.randint(0,100)

为了这个论点,说:

Selection1 = 10
Selection2 = 17
And the list would be like so [25, 50, 75, 100]

两者都将返回 0 的索引,因为它们介于 0-25 之间

所以两者都会落入第一个索引范围,问题是我在尝试将其放入此范围(IE:0-25)时遇到了一些问题,这将返回第一个索引(返回列表[0])

python中这种类型的逻辑的语法是什么?

我敢肯定,如果它们落在同一范围内,我可以弄清楚如何返回不同的索引,可能只是循环重置为循环,但如果我能得到一些建议,那不会有什么坏处。

我将提供我现在正在使用的代码作为指南。大多数情况下,底部是我挣扎的地方。

在这里编码

def roulette_selection(decimal_list, chromosome_fitness, population):
    percentages = []
    for i in range(population):
        result = decimal_list[i]/chromosome_fitness
        result = result * 100
        percentages.append(result)
    print(percentages)
    range_in_fitness = []
    current_percent = 0
    for i in range(population):
        current_percent = percentages[i] + current_percent
        range_in_fitness.append(current_percent)
    parent1 = random.randint(0, 100)
    parent2 = random.randint(0, 100)
    for i in range(population):
        if parent1 >= range_in_fitness[i] and parent1<=range_in_fitness[i+1]:

    print(parent1, parent2)
    print(range_in_fitness)

如果你的范围列表是排序的,或者可以接受排序,并且是连续的(没有间隙),你可以使用 Python 的 bisect 模块以有效的方式执行此操作。例:

>>> l = [25, 50, 75, 100]
>>> import bisect
>>> bisect.bisect(l, 10)
0
>>> bisect.bisect(l, 17)
0
>>> bisect.bisect(l, 55)
2
>>> bisect.bisect(l, 25)
1

Bisect 返回输入数字应落入列表以保持排序顺序的索引。请注意,起初想想有点混乱;在上述55的情况下,它返回2,因为它应该插入索引 2 处,因为它位于索引 12 的当前值之间。如果你在范围边界上精确地给它一个数字,它将"向右下降",如bisect(l,25)的例子所证明的那样。

链接的文档包括一组用于使用 bisect 搜索排序列表的配方。

给定一个输入val和一个范围分隔符列表delims,这里有两种方法:

# Both methods require range_delims to be sorted
range_delims = [25,50,75,100]
# Simple way
def find_range1(val, delims):
    for i,d in enumerate(delims):
        if val < d: return i
print find_range1(10,  range_delims)  # 0
print find_range1(17,  range_delims)  # 0
print find_range1(32,  range_delims)  # 1
print find_range1(64,  range_delims)  # 2
print find_range1(96,  range_delims)  # 3
print find_range1(101, range_delims)  # None

# More explicit, possibly unnecessarily so
import math
def find_range2(val, delims):
    lbl = [float('-inf')] + delims
    ubl = delims + [float('inf')]
    for (i,(lb,ub)) in enumerate(zip(lbl, ubl)):
        if lb <= val < ub: return i
print find_range2(10,  range_delims)  # 0
print find_range2(17,  range_delims)  # 0
print find_range2(32,  range_delims)  # 1
print find_range2(64,  range_delims)  # 2
print find_range2(96,  range_delims)  # 3
print find_range2(101, range_delims)  # 4

第一个只是将valdelims 的元素进行比较,当它发现val小于元素时,返回该元素的索引。

第二个更详细一些,生成上限和下限,并确保val介于它们之间。 对于delims的内部元素,边界是列表元素,对于delims的 2 个外部元素,边界是元素,要么 + 要么 - 无穷大。

注意:这两种方法都需要对输入的分隔符列表进行排序。 有一些方法可以处理不同的分隔符列表格式,但看起来您有一个分隔符的排序列表(或者可以毫无问题地对其进行排序)。

最新更新