Получение значения Python dict - PullRequest
0 голосов
/ 21 ноября 2018

Я получаю синтаксическую ошибку при попытке индексировать диктон Python:

(Pdb) o_model.flows
{(<oemof.solph.network.Bus object at 0x7f3e9c6b3ea8>, <oemof.solph.network.Transformer object at 0x7f3e9c52ce08>): <oemof.solph.network.Flow object at 0x7f3e9c50d5f8>}

Вот ключ dict.:

(Pdb) o_model.flows.keys()
dict_keys([(<oemof.solph.network.Bus object at 0x7f3e9c6b3ea8>, <oemof.solph.network.Transformer object at 0x7f3e9c52ce08>)])

Итак, я предполагаю, что ключ dict равен (<oemof.solph.network.Bus object at 0x7f3e9c6b3ea8>, <oemof.solph.network.Transformer object at 0x7f3e9c52ce08>)

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

Обычно я ожидал получить значение (<oemof.solph.network.Flow object at 0x7f3e9c50d5f8>) dict через, но вместо этого я получаю синтаксическую ошибку:

(Pdb) o_model.flows[(<oemof.solph.network.Bus object at 0x7f3e9c6b3ea8>, <oemof.solph.network.Transformer object at 0x7f3e9c52ce08>)]
*** SyntaxError: invalid syntax

Что я делаю неправильно?

НекоторыеДополнительно:

(Pdb) type(o_model.flows)
<class 'dict'>

1 Ответ

0 голосов
/ 21 ноября 2018

Ваш ключ - это кортеж из двух объектов (Bus, Transformer), поэтому для его индексации, я полагаю, вам нужно где-то хранить этот кортеж при создании словаря, чтобы получить к нему доступ позже или извлечь ключ.Вы можете использовать это:

my_key = list(o_model.flows.keys())[0]
print(o_model.flows[my_key])

Пример:

test = {("qwe","zxc"): [4,5,6]}
print(test.keys()) # dict_keys([('qwe', 'zxc')])
my_key = list(testprint(.keys())[0]
print(flow[my_key]) # [4 5 6]
  • Почему нельзя просто набрать (<oemof.solph.network.Bus object at 0x7f3e9c6b3ea8>, <oemof.solph.network.Transformer object at 0x7f3e9c52ce08>) в качестве клавиши?

Потому что это просто удобочитаемое представление этих объектов, учитывая, что для печати не назначена строка.Общие ключи, такие как строки, также являются объектами в определенном месте, например (<str object at 0x7f45f4f52c36>), но их байты предназначены для интерпретации как символы при печати. ​​

Поэтому вы не используете то, что печатается для индексации, вы должныиспользовать сам объект.

Пример:

class ObjNoStr():
    def __init__(self, x):
        self.x = x

class ObjStr():
    def __init__(self, x):
        self.x = x

    def __str__(self):
        return "I have x: %d" % self.x

o1 = ObjNoStr(3)
o2 = ObjStr(3)
print(o1) # <__main__.ObjNoStr object at 0x7f36d38469b0>
print(o2) # I have x: 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...