所以我有一组dicts(这是一个示例(请参阅下面的代码以获取完整的
{
"XETHXXBT": {
"altname": "ETHXBT",
"wsname": "ETH/XBT",
"aclass_base": "currency",
"base": "XETH",
"aclass_quote": "currency",
"quote": "XXBT",
"lot": "unit",
"pair_decimals": 5,
"lot_decimals": 8,
"lot_multiplier": 1,
"leverage_buy": [
2,
3,
4,
5
],
"leverage_sell": [
2,
3,
4,
5
],
"fees": [
[],
[],
[],
[],
[],
[],
[],
[],
[]
],
"fees_maker": [
[],
[],
[],
[],
[],
[],
[],
[],
[]
],
"fee_volume_currency": "ZUSD",
"margin_call": 80,
"margin_stop": 40,
"ordermin": "0.005"
},
"XXBTZUSD": {
...
"ordermin": "0.0002" }}
当一个键在匹配中时,我想返回完整的dict。
我在使用时不断遇到关键错误:
import krakenex
kex = krankenex.API()
assets = kex.query_public('AssetPairs')
a = {x for x in assets if assets[x]['wsname'] == 'XBT/USD'}
我以为这是做这种事情的"蟒蛇式"方式,但也许我错过了一步?
根据@He3lixxx的评论,这似乎起到了的作用
a = {x for x in assets.keys() if assets[x].get('wsname') == 'XBT/USD'}
是否有一个很好的答案通用建议标签,因为我肯定应该更好地使用try/except块?
也许只是使用异常:
a = []
for x in assets:
try:
if x['wsname']:
a.append(x)
except KeyError:
pass
提示/提醒:对于调试,您可以使用
except KeyError as error_info:
print(error_info)
它将向您提供完整的错误消息。
你可以问
为什么我要使用这个,当我删除异常时,它无论如何都会给我错误?!
答案是:这将忽略错误,因此程序不会停止。
希望这能有所帮助;(
是的,事实上,你写下的dict理解是蟒蛇式的。然而,即使在这样的理解中,你也需要小心:如果你做了什么"坏";,同样的后果也会发生。因此,如果您使用无效密钥访问字典,这将引发IndexError
。
您可以使用dict.get
方法来避免这种情况,该方法采用字典键,如果找不到此键,则默认返回None
。由于None
总是与您正在搜索的字符串不相等,我们可以很高兴地接受这个:
a = {x for x in assets if assets[x].get('wsname') == 'XBT/USD'}
(在我的评论中,我还使用了assets.keys()
来迭代密钥。这有点冗长,而且不会让人怀疑我们在迭代什么,因为x for x in assets
做的完全一样。(