Найти - Пользователи
Полная версия: Ключи словаря как регулярные выражения.
Начало » Python для новичков » Ключи словаря как регулярные выражения.
1
mpolitaev
Всем привет! Помогите прояснить, будьте добры.

Если я хочу обратиться к ключу словаря, но чтоб этим ключем было регулярное выражение.
Нужно для ключей “int(N)”, где N это число в диапазоне , получать одно и то же значение.

Примерно такой словарь:

dict = {'int([1-11])': 5}

Чтоб я мог обратиться к словарю по ключу
"int(10)"

Так:
dict['int(10)']
и получить 5,
dict['int(8)']
и получить ту же 5.

Но чтоб на каждый возмождный вариант строки “int(N)” не создавать по ключу:

dict = {'int(1)': 5, 'int(2)': 5, .. 'int(11)': 5}

Хочу иметь одно регулярное выражение в которое будут подходить все варианты “int(n)”. Возможно ли это сделать? Может быть с помощью модуля re?

FishHook
mpolitaev
Возможно ли это сделать?
Да
mpolitaev
Может быть с помощью модуля re?
Этот модуль, конечно, понадобится.
bismigalis
Пишешь свой класс с дикт-подобным интерфейсом, внутри делаешь магию которая тебе нужна
mpolitaev
Тогда как это сделать?
mpolitaev
А без класса не обойтись? Как-то так:
>>> dict = {re.compile('int([1-11])'): 5}
>>> dict[КАКОЕ-ТО ВЫРАЖЕНИЕ НЕ ЗНАЮ ПОКА КАКОЕ]
5
FishHook
mpolitaev
А без класса не обойтись?
нет
bismigalis
как-то так
class StrangeDict(object):
    def __init__(self):
        self.data = []
        self.keys = set()
    def __setitem__(self, key, value):
        if key in self.keys:
            raise KeyError("Key exists")
        self.keys.add(key)
        self.data.append((key, value))
    def __getitem__(self, key):
        for exp, value in self.data:
            if self.match(key, exp):
                return value
    def match(self, key, exp):
        """magic happens here"""
mpolitaev
FishHook
Нет
Видел без класса делается.

Так сделал:

limits = {'tinyint': 127, 'tinyint unsigned': 255, 'smallint': 32767, 'smallint unsigned': 65535}
field_autoincrement = ('zxzxzxz', 'tinyint(4) unsigned', 'dsdsds')
limit = limits[re.compile('\(\d+\)').sub('', field_autoincrement[1])]
>>>limit
255
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB