【问题标题】:Getting a value of a python dict获取python dict的值
【发布时间】:2018-11-21 11:00:50
【问题描述】:

我在尝试索引 python dict 时遇到语法错误:

(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>}

这里是字典的关键:

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

所以我假设 dict 的键(&lt;oemof.solph.network.Bus object at 0x7f3e9c6b3ea8&gt;, &lt;oemof.solph.network.Transformer object at 0x7f3e9c52ce08&gt;)

问题是我在尝试使用上面提到的键索引o_model.flows 时遇到语法错误。

通常我希望通过获取 dict 的值 (&lt;oemof.solph.network.Flow object at 0x7f3e9c50d5f8&gt;),但我得到了一个语法错误:

(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'>

【问题讨论】:

  • 这不是字典的键,只是一个表示!!!!!!
  • 那我怎么拿到钥匙呢?
  • 我不知道oemof.solph.network.Bus object 是什么(大概是你正在使用的某个库中定义的一个类)——但它绝对不同于字典
  • 首先,只需检查字典中的值 - 使用 print 函数。我想你会发现,那个值不是字典键......
  • 您可以在不需要知道其键的情况下迭代 dict,请参阅 values(), items()。但是这个字典看起来真的很痛苦,给我们看看生成o_model.flows的代码。它的键不是字符串,它们是对象列表。处理这些键会很痛苦。因此,如果可能,请不要那样构建它。

标签: python dictionary indexing


【解决方案1】:

您的键是两个对象(总线、变压器)的元组,因此为了对其进行索引,我想您必须在创建该字典时将该元组存储在某处,以便以后访问它或提取键。你可以使用这个:

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]
  • 为什么不能只键入(&lt;oemof.solph.network.Bus object at 0x7f3e9c6b3ea8&gt;, &lt;oemof.solph.network.Transformer object at 0x7f3e9c52ce08&gt;) 作为键?

因为这只是该对象的人类可读表示,因为没有分配用于打印的字符串。公共键,作为字符串,也是特定位置的对象,例如(&lt;str object at 0x7f45f4f52c36&gt;),但其字节在打印时会被解释为字符。

所以你不使用打印的索引,你应该使用对象本身。

示例:

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

【讨论】:

  • 这行得通,但我不明白为什么我必须存储它?为什么我不能在[brackets] 之间输入
猜你喜欢
  • 1970-01-01
  • 2021-02-26
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
相关资源
最近更新 更多