基本上我想从这一列中提取价格值,但问题是如果我使用index [0]它会在第11行引入index [0]错误,而price key也不会在此行中退出。
ex
0 {u'availableToBack': [{u 'price' : 1.02, u 'size' : 2.15}], u 'availableToLay' : [], u 'tradedVolume' : []}
1 {u'availableToBack': [{u'price': 6.8, u'size':...
2 {u'availableToBack': [{u'price': 8.2, u'size':...
3 {u'availableToBack': [{u'price': 9.6, u'size':...
10 {u'availableToBack': [{u'price': 70.0, u'size'...
11 {u'availableToBack': [], u'availableToLay': []...
12 {u'availableToBack': [], u'availableToLay': []...
我使用类似的东西
table['price'] = table['ex']['availableToBack'][0].apply(lambda x: x.get('price'))
你能帮我解决一下吗?
JSON看起来像这样:
u 'runners' : [{
u 'status' : u 'ACTIVE',
u 'handicap' : 0.0,
u 'selectionId' : 10861647,
u 'totalMatched' : 0.0,
u 'adjustmentFactor' : 16.631,
u 'ex' : {
u 'availableToBack' : [{
u 'price' : 1.02,
u 'size' : 2.15
}
],
u 'availableToLay' : [],
u 'tradedVolume' : []
}
}, {
u 'status' : u 'ACTIVE',
u 'handicap' : 0.0,
u 'selectionId' : 10861648,
u 'totalMatched' : 0.0,
u 'adjustmentFactor' : 13.237,
u 'ex' : {
u 'availableToBack' : [{
u 'price' : 1.01,
u 'size' : 7.11
}
],
u 'availableToLay' : [],
u 'tradedVolume' : []
}
},
答案 0 :(得分:0)
10 {u'availableToBack': [{u'price': 70.0, u'size'...
11 {u'availableToBack': [], u'availableToLay': []...
我刚看到你的availableToBack条目包含一个空列表。如果列表值为空,则进行测试,将其设置为[dict()]。这将允许x.get('price', 0)
正常工作。然后,您将能够在代码的其余部分中将'price'的值处理为0。
然后您将不必测试'无'。
x.get('price')
没有指定“默认”值,因此返回“None”。设置默认值(例如x.get('price', 0)
)这样您应该能够以0价格执行操作。
Python dictionary get() Method
描述
方法get()返回给定键的值。如果没有钥匙 可用然后返回默认值无。语法
以下是get()方法的语法 -
dict.get(key,default = None)
参数
key -- This is the Key to be searched in the dictionary. default -- This is the Value to be returned in case key does not exist.
返回值
此方法返回给定键的值。如果密钥不可用, 然后它返回默认值None。
答案 1 :(得分:0)
我不认为Python有一个安全的内置方法,可以在不触发IndexError
的情况下从列表中获取值,但是编写一个很容易。 (This answer有更多细节。)
如果我理解你的意图,这可能对你有帮助。 (请注意,这仅解决了安全获取列表项的问题。您可能希望对要检索的每个字典值使用.get
以提高安全性。)
def safeget(seq, index, default=None):
try:
return seq[index]
except IndexError:
return default
for table in runners:
price = safeget(table['ex']['availableToBack'], 0, default={}).get('price')
print price
我测试了这个结构,它在第二个对象中有一个u'availableToBack
的空列表。
runners = [
{
u'status' : u'ACTIVE',
u'handicap' : 0.0,
u'selectionId' : 10861647,
u'totalMatched' : 0.0,
u'adjustmentFactor' : 16.631,
u'ex' : {
u'availableToBack' : [
{u'price' : 1.02, u'size' : 2.15},
],
u'availableToLay' : [],
u'tradedVolume' : []
}
}, {
u'status' : u'ACTIVE',
u'handicap' : 0.0,
u'selectionId' : 10861648,
u'totalMatched' : 0.0,
u'adjustmentFactor' : 13.237,
u'ex' : {
u'availableToBack' : [
## this one is MISSING a price
],
u'availableToLay' : [],
u'tradedVolume' : []
}
}
]
答案 2 :(得分:0)
您可以使用三元运算符。空列表的计算结果为false。
<xcdg:DataCell FieldName=".">
<xcdg:DataCell.Template>
<ControlTemplate>
// your template code. here the event of my controls are working.
</ControlTemplate>
</xcdg:DataCell.Template>
</xcdg:DataCell>
答案 3 :(得分:0)
我找到了解决方案并决定发布。基本上也许我没有解释清楚,但问题是列表中有任何内容的不一致。
table['availableToBack.price'] = table['ex'].apply(lambda x: x['availableToBack'][0].get('price') if (len(x['availableToBack']) != 0) else None)