【问题标题】:Find entry in set of dicts with matching key在具有匹配键的字典集中查找条目
【发布时间】:2021-05-25 19:22:52
【问题描述】:

所以我有一组 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" }}

我想在匹配键时返回完整的字典。

我在使用时不断遇到关键错误:

import krakenex
kex = krankenex.API()
assets = kex.query_public('AssetPairs')
a = {x for x in assets if assets[x]['wsname'] == 'XBT/USD'}

我认为这是做这种事情的“pythonic”方式,但也许我错过了一步?

根据@He3lixxx 的评论,这似乎是trick

a = {x for x in assets.keys() if assets[x].get('wsname') == 'XBT/USD'}

是否有一个很好的通用建议标签来回答问题,因为我绝对应该更好地使用 try/except 块?

【问题讨论】:

  • a = {x for x in assets.keys() if assets[x].get('wsname') == 'XBT/USD'} 应该可以解决问题
  • 成功了,非常感谢!

标签: python-3.x dictionary kraken.com


【解决方案1】:

也许只是使用例外:

a = []

for x in assets:
    try:
        if x['wsname']:
            a.append(x)
    except KeyError:
        pass

提示/提醒:用于调试,可以使用

except KeyError as error_info:
    print(error_info)

它会给你完整的错误信息

你可能会问

我为什么要使用这个,当我删除异常时,它还是会给我错误?!

答案是:这将忽略错误,因此程序不会停止。

希望这会有所帮助;)

【讨论】:

  • 这是一个非常糟糕的建议。永远不要使用 try-except 来捕获 ALL 错误并默默地丢弃它们。如果你的代码有问题,你永远不会知道出了什么问题。相反,捕获特定错误。在这种情况下,您知道访问不存在的密钥会引发 KeyErrorexcept KeyError 也是如此。
  • 您的意思是在打印语句之外进行调试; ) ?我确实需要更好地使用 try/except 块,但 cmets 中的解决方案似乎可以解决问题。
【解决方案2】:

是的,确实,您写下的 dict 理解是 Pythonic。但是,即使在这样的理解中,你也需要注意:如果你做任何“坏”的事情,同样的后果也会发生。因此,如果您使用无效键访问字典,则会引发 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 完全一样。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 2015-10-09
    • 2012-05-16
    相关资源
    最近更新 更多