У меня есть фиксированный словарь, который я не могу изменить, и мне нужно найти правильный ключ, не зная количества пробелов в ключах. Вот что у меня есть:

mydict = dict(
    'entry  1'='first',
    'entry  2'='second',
    # ...
    'entry 10'='tenth',
    # ...
)

Мне нужно найти правильную запись на основе "числа", например mydict[entry 4], но не зная, сколько пробелов разделяет слово entry и число. Есть идеи, как я могу этого добиться?

Я предполагаю, что есть какое-то умное регулярное выражение, которое я могу использовать, которое позволяет использовать произвольное количество символов между entry и числом, но с пробелом в качестве единственного разрешенного символа.

1
s6hebern 21 Янв 2021 в 11:15

3 ответа

Лучший ответ

Это решение с регулярным выражением должно работать для вас.

import re

# fixed pre-given dictionary
mydict ={
    'entry  1':'first',
    'entry  2':'second',
    'entry    4' : 'fourth',
    'entry 10':'tenth'}

# the number that you have been given; in your example, 4
num = 4
#loop through the keys and values of the dictionary
for key, val in mydict.items():
    # use regex to find all integers in the key. Ignores the whitespace
    ints = list(map(int, re.findall(r'\d+', key)))
    # if integer in the key, is the number that you have been given
    if num in ints:
        # then you have found your key and value
        print(f'key: {key}\nval: {val}')

Он просматривает каждую пару ключ-значение в словаре и находит ключ, который заканчивается желаемым числом.

1
Jack Morgan 21 Янв 2021 в 08:29

Краткий ответ: нет, вы не можете запросить словарь, не зная точного ключа (и сохраните возможности запроса O (1).

Вариант 1 Использует то же пространство, но занимает мало времени и рассматривает ваш словарь как список

for k, v in mydict.items():
    if k.startswith("entry") and k.endswith(4): ## or use a regex pattern here
        return v

Вариант 2 использует вспомогательную структуру данных, которая отслеживает изменения в mydict и имеет лучшие ключи, нечувствительные к пробелам. Использует пропорционально больше памяти, но вы получаете преимущества словаря

mydict_index = {}
for k, v in mydict.items():
    index_key = k.replace(" ", "")
    mydict_index[index_key] = v

Обратите внимание, что есть более изящные способы выполнения варианта 2, и вы можете скрыть тот факт, что вы используете вспомогательную структуру данных, заключив в нее свой словарь.

0
srj 21 Янв 2021 в 08:25

Используйте следующее регулярное выражение:

import re

my_number = 14

pattern = r"entry\s+{}".format(my_number)

Затем проверьте свои ключи с помощью некоторой функции match или search пакета re.

0
MetallimaX 21 Янв 2021 в 08:47
65823389