我有以下词典列表。
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
答案 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)