1
from glom import glom, T

target = {
    "items": [
                {
                    "label": "valuation",
                    "value": [
                        "900 USD"
                    ]
                },]
}
spec = ('items',[T['value'][0]])
r = glom(target,spec)
print(r)

上面的代码返回一个列表,['900 USD']但我只想获取该列表的内容,即“值”列表中的第一项。在这种情况下,结果应该是900 USD

第2部分

from glom import glom, T, Check, SKIP

target = {
    "items": [
                {
                    "label": "valuation",
                    "value": [
                        "900 USD"
                    ]
                },
                {
                    "label": "other_info",
                    "value": [
                        "700 USD"
                    ]
                },]
}
spec = ({
    'answer': ('items', [Check('label', equal_to='valuation', default=SKIP)],([T['value'][0]]))
})
r = glom(target,spec)
print(r)

上面的代码导致{'answer': ['900 USD']但我只需要 return 900 USD
尝试[0]在括号末尾添加,但没有奏效。
玩弄这种T类型也没有得到我想要的东西

4

2 回答 2

1

我通过迭代我的结果列表并挑选出第一个元素来解决它。
以下规范有效

spec = ({
    'answer': ('items', [Check('label', equal_to='valuation', default=SKIP)],( [T['value'][0]] ,Iter().first()) )
})

注意Iter().first()添加了函数调用。

于 2021-05-13T16:14:15.423 回答
0
spec = {
    'answer': ('items', Iter().filter(
        lambda x: x['label'] is 'valuation'
    ).map('value.0').first())
}

请注意,这是一种流式解决方案,因此对于较大的数据集表现更好。

字符串规范——这里'value.0'是方法的参数map——理解对深度列表的索引。

根据所需的特定逻辑,这也可能有效:

spec = {
    'answer': ('items', Iter().first(
        lambda x: x['label'] is 'valuation'
    ), 'value.0')
}

在这里,我们将过滤逻辑与单个结果的限制相结合。

于 2022-02-22T20:19:17.100 回答