在具有匹配键的字典集中查找条目
Find entry in set of dicts with matching key
所以我有一组字典(这是一个示例)请参阅下面的代码以获得完整的集合
{
"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" }}
我想 return 匹配一个键时的完整字典。
我在使用时一直 运行 进入关键错误:
import krakenex
kex = krankenex.API()
assets = kex.query_public('AssetPairs')
a = {x for x in assets if assets[x]['wsname'] == 'XBT/USD'}
我认为这是 'pythonic' 做这种事情的方法,但也许我漏掉了一步?
根据@He3lixxx this seems to do the trick
的评论
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
Tip/reminder:为了调试,可以使用
except KeyError as error_info:
print(error_info)
它会给你完整的错误信息。
你可能会问
Why should I use this, when I remove the exception, it will give me the error anyways?!
答案是:这将忽略错误,因此程序不会停止。
希望这对您有所帮助 ;)
是的,确实,你写下的字典理解是 pythonic 的。然而,即使在这样的理解中,你也需要注意:如果你做了任何“坏事”,同样的后果也会发生。因此,如果您使用无效键访问字典,这将引发 IndexError
.
您可以使用 dict.get
方法绕过此问题,该方法采用字典键,如果找不到该键,则默认为 returns None
。由于 None
将始终不等于您正在搜索的字符串,我们可以愉快地采用:
a = {x for x in assets if assets[x].get('wsname') == 'XBT/USD'}
(在我的评论中,我还使用了 assets.keys()
来迭代键。这有点冗长,并且不会对我们迭代的内容留下任何疑问,因为 x for x in assets
完全一样。)
所以我有一组字典(这是一个示例)请参阅下面的代码以获得完整的集合
{
"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" }}
我想 return 匹配一个键时的完整字典。
我在使用时一直 运行 进入关键错误:
import krakenex
kex = krankenex.API()
assets = kex.query_public('AssetPairs')
a = {x for x in assets if assets[x]['wsname'] == 'XBT/USD'}
我认为这是 'pythonic' 做这种事情的方法,但也许我漏掉了一步?
根据@He3lixxx this seems to do the trick
的评论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
Tip/reminder:为了调试,可以使用
except KeyError as error_info:
print(error_info)
它会给你完整的错误信息。
你可能会问
Why should I use this, when I remove the exception, it will give me the error anyways?!
答案是:这将忽略错误,因此程序不会停止。
希望这对您有所帮助 ;)
是的,确实,你写下的字典理解是 pythonic 的。然而,即使在这样的理解中,你也需要注意:如果你做了任何“坏事”,同样的后果也会发生。因此,如果您使用无效键访问字典,这将引发 IndexError
.
您可以使用 dict.get
方法绕过此问题,该方法采用字典键,如果找不到该键,则默认为 returns None
。由于 None
将始终不等于您正在搜索的字符串,我们可以愉快地采用:
a = {x for x in assets if assets[x].get('wsname') == 'XBT/USD'}
(在我的评论中,我还使用了 assets.keys()
来迭代键。这有点冗长,并且不会对我们迭代的内容留下任何疑问,因为 x for x in assets
完全一样。)