在 Python 中查找 0-100 值范围内的索引
Finding an index in range of values between 0-100 in Python
这是一个由两部分组成的问题,我必须通过列表中任意数量的整数的随机范围来选择 2 个索引。如果它们都在同一范围内,则不能 return 两者
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]
两者都会 return 0 的索引,因为它们落在 0-25
之间
所以两者都会落入第一个索引范围,问题是我在尝试将其放入这个范围(IE:0-25)时遇到了一些问题,这将 return 这个第一个索引(return列表[0])
python 中这种逻辑的语法是什么?
我确定我能弄清楚如何 return 不同的索引,如果它们落在同一范围内,可能只是循环重置到循环,但如果我能得到一些建议,它不会受伤了。
我将提供我现在使用的代码作为指导。大多数底部是我挣扎的地方。
代码在这里
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
平分 returns 输入数字应落入列表的索引以保持排序顺序。请注意,一开始考虑这有点令人困惑;在上面 55
的情况下,它是 returns 2
因为它应该插入索引 2,因为它落在索引 1
和 2
的当前值之间.如果你给它一个恰好在范围边界上的数字,它将 'fall to the right',如 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
第一个只是比较val
和delims
的元素,当它发现val
小于该元素时,returns该元素的索引。
第二个有点冗长,生成上限和下限,并确保 val
在它们之间。对于 delims
的内部元素,边界是列表元素,对于 delims
的 2 个外部元素,边界是元素和 + 或 - 无穷大。
注意:这两种方法都需要对输入的分隔符列表进行排序。有多种方法可以处理不同的分隔符列表格式,但看起来您有一个排序的分隔符列表(或者可以毫无问题地对其进行排序)。
这是一个由两部分组成的问题,我必须通过列表中任意数量的整数的随机范围来选择 2 个索引。如果它们都在同一范围内,则不能 return 两者
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]
两者都会 return 0 的索引,因为它们落在 0-25
之间所以两者都会落入第一个索引范围,问题是我在尝试将其放入这个范围(IE:0-25)时遇到了一些问题,这将 return 这个第一个索引(return列表[0])
python 中这种逻辑的语法是什么?
我确定我能弄清楚如何 return 不同的索引,如果它们落在同一范围内,可能只是循环重置到循环,但如果我能得到一些建议,它不会受伤了。
我将提供我现在使用的代码作为指导。大多数底部是我挣扎的地方。
代码在这里
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
平分 returns 输入数字应落入列表的索引以保持排序顺序。请注意,一开始考虑这有点令人困惑;在上面 55
的情况下,它是 returns 2
因为它应该插入索引 2,因为它落在索引 1
和 2
的当前值之间.如果你给它一个恰好在范围边界上的数字,它将 'fall to the right',如 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
第一个只是比较val
和delims
的元素,当它发现val
小于该元素时,returns该元素的索引。
第二个有点冗长,生成上限和下限,并确保 val
在它们之间。对于 delims
的内部元素,边界是列表元素,对于 delims
的 2 个外部元素,边界是元素和 + 或 - 无穷大。
注意:这两种方法都需要对输入的分隔符列表进行排序。有多种方法可以处理不同的分隔符列表格式,但看起来您有一个排序的分隔符列表(或者可以毫无问题地对其进行排序)。