2015-06-15 2 views
0

У меня есть один словарь с ключом и значением. Ключ - это имя строки, а значение - последнее место. Я хотел бы найти номер строки на основе входного значения.Как найти точное место для заданного значения в словаре python?

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

Вход:

seat_num = 16

Выход: Должно быть 'B'

Есть ли функция идентичности этого в Python?

+1

Каковы границы, как - Что бы Автокресло 31 или 41 в качестве входных данных дают вам? У каждого ряда сидений всегда 10 мест? –

+0

граничные значения от 1 до 30. строка всегда 10 мест –

+1

Есть ли причина, по которой вам нужно иметь это в словаре? Это не похоже на правильную структуру, если это все, в чем вы нуждаетесь. – skaz

ответ

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 

Таким образом, вы Кроме того, естественно, может проверить границы/добавить несколько строк - размеры сидений изменений для каждой строки ...

Вы можете включить строки с помощью вложенного списка-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'

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]
2

Это звучит как ваш словарь будет более полезным, перевернутым с точкой зрения ключей и значений.

seats_dict = т.е. {10: 'А', 20: 'В', 30: 'С'}

Затем вы просто нужно найти самый низкий ключ, так что last_key < < п = ключ. Вы можете сделать это с помощью бинарного поиска.

Как @Jon намекает на то, что было бы еще проще, если бы всегда было 10 мест подряд (вам может не понадобиться словарь вообще).

+0

Этот ответ был бы полезен для неровных строк длины. См. Мой другой ответ для простого случая с фиксированной длиной строки. – eddiewould

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)) 
+0

сиденье (1) = A, седло (2) = A, седло (10) = A, седло (11) = B, седло (21) = C – eddiewould

2

Мне кажется, что seats_dict не имеет полную карту для сидений и секций, но только конец каждого раздела.

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

Вход:

seat_num = 16 ## Примечание: Я не вижу 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} 
Смежные вопросы