Python получить по индексу для словаря - PullRequest
0 голосов
/ 26 августа 2011

У меня есть подкласс, который наследуется от dict. На методе __getitem__ я хотел бы проверить, является ли ключ числовым или нет. Если это числовое значение, я бы хотел реализовать другое поведение, а если нет, то я бы хотел продолжить, как обычно. Пример:

class M(dict):
   ...
   def __getitem__(self, key):
      if self.isNumber(key):
          print "I am number"
      else:
          # continue the same way as it would have done
   ...

>>> x = M({"name": "Tom", "surname": "Baker", "age": "55"})
>>> print x["name"]
Tom
>>> x[0]
I am number

Как я могу это сделать?

UPDATE

Я знаю, что элементы в dict хэшируются, поэтому он не будет в порядке, причина, по которой я спрашиваю, заключается в другом. И так как я уверен, что вы все равно спросите почему, это причина: dict - это объект, и я извлеку объекты, связанные с данным объектом, по их индексу. (Думай как родитель, детка)

Ответы [ 4 ]

2 голосов
/ 26 августа 2011

Не уверен, что это то, что вы ищете ...

class M(dict):

    def __getitem__(self, key):
        try:
            temp = int(key)
            return "I am a number"
        except ValueError:
            return self.get(key, None)

item = M({'one':'1', 'two':'2', '3':'three'})

print item['one']
print item[3]
print item[0]

Как уже упоминалось @bpgergo, вы также можете использовать super.

Так что результат будет выглядетьнапример:

    except ValueError:
        return super(M, self).__getitem__(key)

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

2 голосов
/ 26 августа 2011
# continue the same way as it would have done

Здесь используется функция super(). (это не шутка)
http://docs.python.org/library/functions.html#super

1 голос
/ 26 августа 2011

Для этого вам нужно вызвать метод __getitem__ родительского класса, если ключ не числовой Это делается с помощью функции super (). Смотрите пример ниже:

class cls(dict):
     def __getitem__(self, key):
         if isinstance(numbers.Number):
             print "I am a number"
         else:
             return super(cls, self).__getitem__(key)
0 голосов
/ 26 августа 2011

Вам необходимо проиндексировать список ключей для словаря.Пример:

x = dict({"name": "Tom", "surname": "Baker", "age": "55"})
print x[x.keys()[0]]
'55'

Редактировать: Как я подозревал, порядок не гарантирован.

"Ключи и значения перечислены в произвольном порядке, который не является случайным, варьируется в зависимости отРеализации Python, и зависит от истории вставок и удалений словаря. Если items (), keys (), values ​​(), iteritems (), iterkeys () и itervalues ​​() вызываются без промежуточных модификаций словаря,списки будут напрямую соответствовать. Это позволяет создавать пары (значение, ключ) с помощью zip (): "pair = zip (a.values ​​(), a.keys ())". То же самое относится и к iterkeys () иМетоды itervalues ​​(): "pair = zip (a.itervalues ​​(), a.iterkeys ())" предоставляет одинаковое значение для пар. Другим способом создания того же списка является "pair = [(v, k) for (k), v) в a.iteritems ()] "."

Источник: http://docs.python.org/release/2.5.2/lib/typesmapping.html

Учитывая это, я думаю, что лучше не предполагать, что SLA из словаря (Что порядок ключей не изменится)

...