Python 从DICT列表中查找最小键值,忽略None值

Python 从DICT列表中查找最小键值,忽略None值,python,Python,给出一个Dict列表: myList = [{"id":1, "qty":100}, {"id":2, "qty":None}, {"id":3, "qty":-60}, {"id":4, "qty":120}, {"id":5}] 返回myList中的最小数量最简洁的方法是什么,忽略无值和缺失值(即本例中的-60);如果没有项目具有非无数量值,则为无 我目前的解决方案是冗长的: minval = 999999

给出一个Dict列表:

myList = [{"id":1, "qty":100},
          {"id":2, "qty":None},
          {"id":3, "qty":-60},
          {"id":4, "qty":120},
          {"id":5}]
返回myList中的最小数量最简洁的方法是什么,忽略无值和缺失值(即本例中的-60);如果没有项目具有非无数量值,则为无

我目前的解决方案是冗长的:

minval = 999999    # Largest feasible value for qty
for item in myList:
    if item.get('qty', None) is not None:
        minval = min(minval, item['qty'])
if minval = 999999:
    minval = None

我也不喜欢硬编码的999999初始值。

min
与生成器一起使用:

myList = [{"id": 1, "qty": 100},
          {"id": 2, "qty": None},
          {"id": 3, "qty": -60},
          {"id": 4, "qty": 120}]

print(min(d.get('qty') for d in myList if d.get('qty') is not None))
输出

-60
在Python>=3.8中,您可以使用walrus运算符,因此
d.get('quaty')
不会计算两次:

print(min(val := d.get('qty') for d in myList if val is not None))


如果您预计所有的
quantity
值都将是
None
,您可以将
default=None
(或任何您想要的值)传递到
min
,这样它就不会抱怨它得到了一个空序列。

您可以过滤掉
None
,然后用键获取最小值

 min(filter(lambda x: x["qty"] is not None, myList), key=lambda x: x["qty"])

这将返回具有最小数量的对象,如果您希望获取整数值,则需要使用
pandas
从字典中访问该整数值:

min([max(0,x['qty']) for x in myList if x['qty']])
将熊猫作为pd导入
x=pd.DataFrame(myList)[“数量”].min()
#产出:
>> -60.0

这是否回答了您的问题?您希望得到
-60
还是数量最少的对象?变量和函数名称应遵循带下划线的
小写形式。我很好奇你为什么要用一系列字典来做这个?谢谢。为了弥补缺少的关键点,我想我应该使用:
print(如果d.get(qty,None)不是None,我的列表中d的最小值(d['qty'])
@nakb correct,或者只是
d.get(qty)
,因为
None
的默认值。get
如果它们都是None(…或者如果没有任何项目具有非None-None-qty值,则为None)怎么办?@Ev.Kounis然后执行
print(min((d>)如果d['qty']不是无,则myList中d的['qty'],默认值=无]
或OP认为有效的任何sentinel值,如果它们都是
(…如果没有项目具有非无qty值,则为无?)??@Ev.Kounis-op可以用不同的方式处理它,如果他们需要避免在之前重复列表(或者提供DeepSpace在他们的评论中包含的默认值(我已经忘记了)),如果op还没有使用pandas,那么我会在这里捕捉异常