如何在python字典中找到给定值的确切位置?

时间:2015-06-15 09:30:13

标签: python dictionary

我有一个带键和值的字典。键是行名称,值是最后一个座位号。我想根据输入值找到行号。

seats_dict={'A':10,'B':'20':'C':30}

输入:

seat_num = 16

输出: 应该' B'

在python中是否有任何函数可以识别它?

5 个答案:

答案 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))