0

我有以下字典元组:

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

我想获取与 key 关联的值frameId。我对元组和字典没有太多经验,我发现的问题是关于元组字典的,所以我请求你的帮助。谢谢

编辑:实际上我已经尝试过你的解决方案,但我忘了提到我正在使用 python 从另一个程序中获取结果。这个程序有一个特定的组织,所以为了工作,我不得不写td.frameId

4

6 回答 6

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']
于 2013-05-09T15:18:40.407 回答
1

这不是一个元组,它只是一个安静的dict......即(无用的)括号中的字典。

td['frameId']查找密钥。

笔记:

({'this': 'would be a dict in a tuple'},)

于 2013-05-09T15:19:04.370 回答
1

您可以使用列表理解:

matches = [ d for d in td if d['frameID'] == DESIRED_VALUE ]

(假设td实际上有多个字典;您的示例只是一对冗余括号中的单个字典。)

于 2013-05-09T15:19:05.060 回答
1

您没有使用字典元组, td 本身就是字典。然后,如果您想使用td['frameId'].

于 2013-05-09T15:19:13.117 回答
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'])

也许你错过了''.

于 2013-05-09T15:19:47.837 回答
0

快速回答:

td.get('frameId')

长答案:

其实真的很简单!元组在 Python 中被认为是不可变的对象(也就是一旦创建,您就会被“锁定”而无法进行更改),而字典是 Python 处理哈希表的方式。

除此之外,您的示例不是元组。

为了制作一个 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 字典,包裹在括号中 - 括号并没有真正为你做任何事情。 注意: 在这种情况下,尾随逗号是必需的,因为元组中只有一个元素。如果您有多个元素,则不需要尾随逗号

但是让我们假设想要一个元组内的嵌套字典,并且您做得正确,您需要首先访问元组内的字典 - 这是通过使用index来完成的。

因此,例如,如果您有以下情况

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()(与弹出、索引或使用生成器进行迭代和查找相反——这只是浪费和无能),您可以按照设计使用一些 Python 内置函数。

此外,它使您可以更好地控制返回值,因为如果key字典中不存在 ,它将返回None。因为大多数程序员都喜欢更健壮,所以这是进行任何类型的错误捕获的开始!

作为一个优点,如果它不返回您期望的值,您还可以设置默认值。例如:

new_td.get('frameSurpriseID', "Sorry, it doesn't exist!")

因为 frameSurpriseID 不是key字典中的a,所以new_td没有关联value,所以它通常会返回None(False)。但是,因为您传递了第二个位置(在这种情况下,它是默认返回值),所以它将改为 return 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()(更多控制,更强大的恕我直言)。

于 2013-05-09T15:44:41.260 回答