我有以下词典元组:
td=({'associatedFrame': None,
'cyclicModeNumber': None,
'description': 'Increment 10: Arc Length = 7.2813E-02',
'domain': 'ARC_LENGTH',
'fieldOutputs': 'Repository object',
'frameId': 10,
'frameValue': 0.0728124976158142,
'frequency': None,
'incrementNumber': 10,
'isImaginary': False,
'loadCase': None,
'mode': None})
我想获得与密钥frameId
相关联的值。
我没有很多关于元组和词典的经验,我发现的问题是关于元组的字典,所以我请求你的帮助。感谢
编辑:
实际上我已经尝试过你的解决方案,但我忘了提到我正在使用python从另一个程序中获取结果。这个程序有一个特定的组织,所以为了工作我必须写td.frameId
。
答案 0 :(得分:1)
如果这真的是你所拥有的,它只是一本字典。
td['frameId']
会奏效。括号不构成元组。逗号是构成元组的原因。
foo = (1) #integer
foo = (1,) #1 element tuple
foo = 1, #1 element tuple
括号仅在语法不明确的少数情况下是必需的(如函数调用)。清楚:
foo(1,2,3)
不同于;
foo(1,(2,3))
如果您确实拥有tuple
,那么您需要将其编入索引以获取您可以编制索引的字典以获取所需的项目。
td[0]['frameId']
答案 1 :(得分:1)
这不是一个元组,它只是一个安静的dict
......即(无用的)括号中的字典。
td['frameId']
查找密钥。
注意:
({'this': 'would be a dict in a tuple'},)
答案 2 :(得分:1)
您可以使用列表理解:
matches = [ d for d in td if d['frameID'] == DESIRED_VALUE ]
(假设td
实际上有多个字典;你的例子只是一对冗余括号中的一个字典。)
答案 3 :(得分:1)
你没有使用字典元组,td本身就是一本字典。
然后,如果您想使用td['frameId']
获取td值。
答案 4 :(得分:1)
td=({'associatedFrame': None,
'cyclicModeNumber': None,
'description': 'Increment 10: Arc Length = 7.2813E-02',
'domain': 'ARC_LENGTH',
'fieldOutputs': 'Repository object',
'frameId': 10,
'frameValue': 0.0728124976158142,
'frequency': None,
'incrementNumber': 10,
'isImaginary': False,
'loadCase': None,
'mode': None})
print(td['frameId'])
也许你错过了''
。
答案 5 :(得分:0)
快速回答:
td.get('frameId')
答案很长:
实际上真的很容易!元组被认为是Python中的不可变对象(也就是说,一旦创建你被“锁定”进行更改),而字典是Pythons做哈希表的方式。
除此之外,你的例子不是一个元组。
为了制作Python元组,您需要完成:
td=({'associatedFrame': None, 'cyclicModeNumber': None, 'description': 'Increment 10: Arc Length = 7.2813E-02', 'domain': 'ARC_LENGTH', 'fieldOutputs': 'Repository object', 'frameId': 10, 'frameValue': 0.0728124976158142, 'frequency': None, 'incrementNumber': 10, 'isImaginary': False, 'loadCase': None, 'mode': None},)
你问的有什么不同?在字典上的结束括号之后和结束之前看到尾随,
?这是Python制作元组的方式。你所拥有的是一个PURE Python字典,包含在parens中 - 并且parens并没有真正为你做任何事情。 NB:在这种情况下,需要使用尾随逗号,因为元组中只有一个元素。如果你有多个元素,那么尾随的逗号将不是必要的。
但我们假设你想要一个元组中的嵌套字典,而你做得正确,你需要首先访问元组中的字典 - 这个通过使用索引来完成。
所以,例如,如果你有以下
sampleTuple = ([0, 1, 2], "abc", {"test": "meout", "again": "andagain"})
换句话说,在惯用的原始编程命名法(= P)中会是:
sampleTuple = (LIST_OBJECT, STIRNG_OBJECT, DICTIONARY_OBJECT)
您可以通过执行以下操作来访问第一个元素(LIST_OBJECT):
sampleTuple[0]
这将返回列表:
[0, 1, 2]
注意:第一个元素由它的'offset'值引用,在这种情况下,偏移量“0”表示元组的开头。
可以通过以下方式达到第二个元素:
sampleTuple[1]
这将返回字符串:
"abc"
依此类推......
看起来像这样:
Index Values |-----0----| |-----1-----| |-------2--------|
sampleTuple = (LIST_OBJECT, STIRNG_OBJECT, DICTIONARY_OBJECT)
在你的情况下(如果你有试用逗号),你在元组中有一个嵌套对象(字典)。因此,您需要通过执行上述相同类型的“偏移”方法来访问它:
td[0]
这将产生字典:
{'associatedFrame': None,
'cyclicModeNumber': None,
'description': 'Increment 10: Arc Length = 7.2813E-02',
'domain': 'ARC_LENGTH',
'fieldOutputs': 'Repository object',
'frameId': 10,
'frameValue': 0.0728124976158142,
'frequency': None,
'incrementNumber': 10,
'isImaginary': False,
'loadCase': None, 'mode': None}
现在,有趣的部分是在python中使用字典方法。有几种方法可以实现,但我发现“最安全”的方法是使用dict.get()
。
这是我的示例输出......
>>> td=({'associatedFrame': None, 'cyclicModeNumber': None, 'description': 'Increment 10: Arc Length = 7.2813E-02', 'domain': 'ARC_LENGTH', 'fieldOutputs': 'Repository object', 'frameId': 10, 'frameValue': 0.0728124976158142, 'frequency': None, 'incrementNumber': 10, 'isImaginary': False, 'loadCase': None, 'mode': None},)
>>> type(td)
<type 'tuple'>
>>> new_td = td[0]
>>> type(new_td)
<type 'dict'>
>>> new_td.get('frameId')
10
通过使用dict.get()
(而不是弹出,索引或执行生成器进行迭代和查找 - 这只是简单的浪费和无用),您可以使用一些Pythons内置的设计。
此外,它可以更好地控制返回值,因为如果字典中不存在key
,它将返回None
。因为大多数程序员都喜欢更健壮,所以这就是做任何错误捕获的开始!
作为一个精确的例子,如果它没有返回您期望的值,您也可以设置默认值。例如:
new_td.get('frameSurpriseID', "Sorry, it doesn't exist!")
因为frameSurpriseID不是字典key
中的new_td
,所以没有关联的value
,因此它通常会返回None
(False)。但是,因为你传递了第二个位置(在这种情况下,它是默认的返回值),它将返回Sorry, it doesn't exist
。
警告强>
其他答案建议将索引作为从字典中提取值的方法。如果您知道您的词典总是具有相同的key:value
对,那么这很好。但是,观察下列情况下的行为:
>>> new_td['myKey']
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
new_td['myKey']
KeyError: 'myKey'
这就是为什么我建议使用Python字典方法.get()
(更多控件,更强大的恕我直言)。