如何根据输入的用户输入基于两个列表打印范围?

时间:2019-04-01 01:09:20

标签: python python-3.x list range

所以基本上,我想编写一个基于两个列表的python程序,例如:

minsalary = [22000,41000,10000,51500,13000]

maxsalary = [35000,95000,34000,65000,31000] 

用户输入一个输入,然后根据输入,程序根据输入AND位置打印出范围。每个索引对应一个工作和范围。因此,在喉部的索引(位置)0和在喉部的索引0都是与作业0对应的范围。因此,从22000到35000的索引0本身就是作业。

它基于最高薪水,每个范围对应一个索引(或工作职位)
因此,如果用户输入30000,程序将根据位置0(索引)打印最佳范围为22000至35000。

2 个答案:

答案 0 :(得分:0)

将内置minkey一起使用:

minsalary = [22000,41000,10000,51500,13000]

maxsalary = [35000,95000,34000,65000,31000] 

def ranger(user_input):
    lower = min(minsalary, key = lambda x: abs(x-user_input))
    upper = min(maxsalary, key = lambda x: abs(x-user_input))
    print('Best range is %s to %s, use position %s' % (lower, upper, maxsalary.index(upper)))

输出:

ranger(13000)
# Best range is 13000 to 31000, use position 4

答案 1 :(得分:0)

这将不会混淆不同索引(例如33000)的最小值/最大值:

minsalary = [22000,41000,10000,51500,13000]
maxsalary = [35000,95000,34000,65000,31000]
salary    = 14000
index     = min((b-a,i) for i,(a,b) in enumerate(zip(minsalary,maxsalary)) if salary in range(a,b+1))[1]
print(f'Best range is {minsalary[index]} to {maxsalary[index]}, use position {index}')

以下是细分版本,可以更好地隔离每个步骤:

ranges          = zip(minsalary,maxsalary)  # [ (min,max), (min,max), ... ]
indexedRanges   = enumerate(ranges)         # [ (0,(min,max)), (1,(min,max)) ... ]
eligibleIndexes = [ (b-a,i) for i,(a,b) in indexedRanges if salary>=a and salary <= b ] # [ (size,2), (size,4) ]
smallest        = min(eligibleIndexes) # (size,4)
index           = smallest[1]
print(f'Best range is {minsalary[index]} to {maxsalary[index]}, use position {index}')
  • ranges变量将两个数组转换为元组数组,其薪水在(最小,最大)范围内。
  • indexedRanges变量将索引(位置)添加到范围元组
  • eligibleIndexes过滤器indexedRanges仅保留薪水在范围内的项目,并返回范围大小和相应的索引
  • smallest变量接收eligibleIndexes的最小条目,该条目的范围大小最小。结果是一个具有大小和索引的元组。
  • 符合条件的最佳范围的indexsmallest元组的第二部分。