Как задать условие в индексе?

    map["value1"] = 1
    map["value2"] = 2
    map["value3"] = 3
    map["1"] = 10
    map["2"] = 20
    map["3"] = 30
    map["1, 5"] = 100
    map["5, 5"] = 200
    map["10, 5"] = 300
    map.ploc[">=1"]  // >>> {1=10, 2=20, 3=30} 
    map.ploc[">0, >0"] // >>> {(1, 5)=100, (5, 5)=200, (10, 5)=300}

где map = SpecialHashMap() - мой класс для расширения словаря. ploc - поле для доступа (выборка всех пар ключ:значение по определенному условию) введите сюда описание изображения


Ответы (1 шт):

Автор решения: insolor

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

Под ваше задание вам нужно будет модифицировать метод __getitem__ класса Ploc.

class Ploc:
    def __init__(self, d):
        # Через параметр нужно d будет передать словарь,
        # который нужно будет фильтровать по условию,
        # переданному в квадратных скобках
        self.dict = d  
    
    def __getitem__(self, filter_value):
        new_map = SpecialHashm()
        # Тут каким-то образом по filter_value фильтруем значения из self.dict
        # Я буду считать, что передается лямбда-функция,
        # которая принимает ключ, по его значению фильтрует
        
        for key, value in self.dict.items():
            try:
                if filter_value(int(key)):
                    new_map[key] = value
            except ValueError:
                pass  # Игнорируем ключи, которые не удалось преобразовать к int
        
        return new_map


class SpecialHashm:
    def __init__(self):
        self.dict = dict()
        self.ploc = Ploc(self.dict)
    
    def __getitem__(self, key):
        return self.dict[key]
    
    def __setitem__(self, key, value):
        self.dict[key] = value
    
    def items(self):
        return self.dict.items()
    
    def __repr__(self):
        return repr(self.dict)


m = SpecialHashm()
m["value1"] = 1
m["value2"] = 2
m["value3"] = 3
m["1"] = 10
m["2"] = 20
m["3"] = 30
m["1, 5"] = 100
m["5, 5"] = 200
m["10, 5"] = 300

print(m.ploc[lambda key: key >= 2])  # Выведет {'2': 20, '3': 30}
→ Ссылка