我有一个带键和值的字典。键是行名称,值是最后一个座位号。我想根据输入值找到行号。
seats_dict={'A':10,'B':'20':'C':30}
输入:
seat_num = 16
输出: 应该' B'
在python中是否有任何函数可以识别它?
答案 0 :(得分:2)
听起来你的字典在键和值方面更有用。
ie seats_dict = {10:' A',20:' B',30:' C'}
然后你需要找到最低的密钥,使得last_key< n是< = key。你可以通过二进制搜索来做到这一点。
正如@Jon所暗示的那样,如果连续总共有10个席位(你可能根本不需要字典),情况会更容易。
答案 1 :(得分:2)
在我看来,seats_dict
并不包含座位和部分的完整地图,而只包含每个部分的结束编号。
seats_dict={'A':10,'B':'20':'C':30}
输入:
seat_num = 16 ##注意:我在dict中看不到16
输出:应该是' B'
这个查找函数怎么样:
def get_row(seat_num):
seat_ranges = {10: "A", 20: "B", 30: "C"} # inverted dict
matching_ranges = [k for k in seat_ranges if k >= seat_num]
if not matching_ranges:
raise ValueError("No row found for seat number %d" % seat_num)
return seat_ranges.get(min(matching_ranges))
示例输出:
>>> get_row(16)
'B'
>>> get_row(17)
'B'
>>> get_row(31)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in get_row
ValueError: No row found for seat number 31
row_name = {k:seat_ranges[k] for k in d if k>1}
答案 2 :(得分:1)
鉴于边界值是1到30.行总共有10个席位 ...你最好建立一个值列表,然后建立索引,例如:
seats = ''.join(row * 10 for row in 'ABC') # add DEFG etc.. for additional rows
try:
print seats[15] # note Python indices are 0 based
except IndexError:
pass # no row found - do something
这样你也可以自然地检查边界/添加更多行 - 改变每行的座位大小......
您可以使用嵌套的list-comp包含行,例如:
seats = ['{}{}'.format(r, n) for r in 'ABC' for n in range(1, 11)]
#['A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'A10', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B9', 'B10', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'C8', 'C9', 'C10']
然后索引与上面相同 - 例如:seats[15]
给出'B6'
答案 3 :(得分:0)
我不知道有任何内置的python函数来执行此操作,但您可以使用快速列表解析来过滤字典并返回第一个值。
请注意,无论字典顺序如何,排序都可以使用它:
seats_dict={'A':10,'C': 30, 'B':20} seats_num = 16 print sorted([row for row in seats_dict if seats_dict[row] >= seats_num])[0]
答案 4 :(得分:0)
这样的事情:
def seat(n):
if n > 260 or n < 1:
raise ValueError("Seat number must be between 1 and 260 (inclusive)")
return chr(ord('A') + ((n - 1) // 10))