从python字典列表中获取最小的大于值

时间:2018-09-19 08:58:59

标签: python list dictionary lambda

我想实现什么?

我有以下词典列表。

values=[
   {
    "tax": 6,
    "threshold": 1000
  },
  {
    "tax": 9,
    "threshold": 2500
  },
  {
    "tax": 14,
    "threshold": 7500
  }
]

我想获得最小的税收价值,适用于大于或等于该价值的某些金额。假设:

如果我的金额是1100,我将其与这些指标的阈值进行比较。我应该得到tax = 9的值。

到目前为止我能做些什么?

floor_value = map(lambda x: x.get("tax") if x.get(
        "threshold") > 1000 else None, values)
print (floor_value)

output:
[None, 9, 14]

我想要的是floor_value = 9

5 个答案:

答案 0 :(得分:0)

这是一种方法。

演示:

values = [{'tax': 6, 'threshold': 1000}, {'tax': 9, 'threshold': 2500}, {'threshold': 7500, 'tax': 14}]
v = 1100 

def getValue(values, v):
    for i in sorted(values, key=lambda x: x["threshold"]):   #Sort list by threshold
        if i["threshold"] >= v:     #Compare
            return i["tax"]         #Return

print(getValue(values, v))

输出:

9

答案 1 :(得分:0)

我真的很讨厌那种班轮,我建议你不要用它来解决你的问题。

import functools
functools.reduce(lambda x,y : y if 1100 < y['threshold'] < x['threshold'] else x,
                 values,
                 {'threshold' : float('inf')}
                )['tax']

如果没有条目符合条件,则会引发KeyError

这也可以,但是需要更多的操作(仍然是O(n),需要遍历过滤后的列表以找到最小值):

min([(v['threshold'], v['tax']) for v in values if v['threshold'] > 1100])[1]

如果没有匹配项,也会引发错误

这是您应该采取的解决方案(或类似方法):

result = None
for value in values:
    threshold = value['threshold']
    if threshold > 1100 and (not result or threshold < result['threshold']):
        result = value
print(result['tax'])

因为我不同意

  

@Shinratensei我同意,但是我想要一种/两种线性方法来解决这个问题,因为我的代码已经增加了,这只是我正在做的一小部分。因此,我正在寻找一种尽可能简洁的方法。

答案 2 :(得分:-1)

您的数据结构对您尝试执行的操作没有帮助。像这样修改它:

values=[
   {
    "tax": 6,
    "entry_value": 0,
    "threshold": 1000
  },
  {
    "tax": 9,
    "entry_value": 1000,
    "threshold": 2500
  },
  {
    "tax": 14,
    "entry_value": 2500,
    "threshold": 7500
  }
]

那你就可以做

>>> number = 1100
>>> [d["tax"] for d in values if d["entry_value"] < number <= d["threshold"]]
[9]

但这仅在您持续拼写阈值时有效。

答案 3 :(得分:-1)

如果喜欢,请尝试

number = 1234
l = [value for value in values if value["threshold"] > number]
floor_value = sorted(l, key = lambda i: i["threshold"])[0]["tax"]

答案 4 :(得分:-2)

我注意到词典中存在命名错误。 “阈值”和“阈值”,但此处的解决方案有效。

min_value = 1000

floor_value =  min([x.get("tax") for x in values if x.get("threshhold", 0) > min_value])

print(floor_value)