【问题标题】:How do I get the min non-zero value inside this nested dictionary如何在此嵌套字典中获取最小非零值
【发布时间】:2020-01-16 06:13:44
【问题描述】:

我有这个嵌套字典:

+-------------+--------------+-------------------+
|    PAK ID   | License used | License available |
+-------------+--------------+-------------------+
| ASG6C1TU08I |      15      |        235        |
| HK5JQ5TFR8Z |      50      |         0         |
| 4HIZBOYUS9S |      81      |        169        |
| 4T6Y77AK1LZ |      50      |         0         |
| X2ACDW29EEH |      50      |         0         |
| W487IEVM0BD |      50      |         0         |
+-------------+--------------+-------------------+

>>> print(license_dic)
{'entry1': {'pak_id': 'ASG6C1TU08I', 'used_license': '15', 'available_license': '235'}, 'entry3': {'pak_id': 'HK5JQ5TFR8Z', 'used_license': '50', 'available_license': '0'}, 'entry5': {'pak_id': '4HIZBOYUS9S', 'used_license': '81', 'available_license': '169'}, 'entry7': {'pak_id': '4T6Y77AK1LZ', 'used_license': '50', 'available_license': '0'}, 'entry9': {'pak_id': 'X2ACDW29EEH', 'used_license': '50', 'available_license': '0'}, 'entry11': {'pak_id': 'W487IEVM0BD', 'used_license': '50', 'available_license': '0'}}

我可以使用以下方法获取“可用许可证”最大值的密钥:

for k,v in license_dic.items():
    max_entry =max(license_dic, key=lambda v: license_dic[v]['available_license'])

返回:

>>entry1

我正在尝试获取 'available_license' 的最小非零值的密钥,在这种情况下,它应该返回 'entry5',因为 'entry5 具有最低的非零 'available_license'。

我试过了:

for k,v in license_dic.items():
     min_entry =min(license_dic, key=lambda v: license_dic[v]['available_license'] if key !=0)

但我遇到语法错误

【问题讨论】:

  • 你需要else 部分,对吧?
  • 第一个代码不需要 for in 循环,第二行是你唯一需要的,你看不到你从不使用循环的 k 和 v

标签: python python-3.x


【解决方案1】:
  1. 您绝对不需要循环,单个max/min 语句很有用。
  2. 您正在比较str类型,您需要将它们解析为int
  3. 您需要在测试中使用else,例如使用10**10(100 亿)作为默认值来替换0,因为您可以使用丑陋的if/else(见最后)或使用布尔值使用or 的方式

最后你需要

max_entry = max(license_dic, key=lambda k: int(license_dic[k]['available_license']))
# entry1

min_entry = min(license_dic,key=lambda k:int(license_dic[k]['available_license']) or 10**10)
# entry5

丑陋的方式

min_entry = min(license_dic, key=lambda k: int(license_dic[k]['available_license']) if int(license_dic[k]['available_license']) != 0 else 10 ** 10)

【讨论】:

  • 谢谢!它起作用了...你能解释一下 ,我不明白。
  • @Checksum321 我使用bool(0) == False,所以如果你有0,它就像假,所以它会检查ˋor`的另一边的值,这里是10 pow 10
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-09
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
相关资源
最近更新 更多