Получить наименьшее значение больше чем из списка словарей Python - PullRequest
0 голосов
/ 19 сентября 2018

Чего я хочу достичь?

У меня есть следующий список словарей.

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 голосов
/ 19 сентября 2018

Я действительно ненавижу такой лайнер и советую вам не использовать его для вашей проблемы.

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 Я согласен, но я хочу подход к проблеме с одним или двумя вкладышамиПотому что мой код увеличился, и это только часть того, что я делаю.Поэтому я нахожу максимально лаконичный способ.

0 голосов
/ 19 сентября 2018

Я заметил, что в словарях есть ошибка именования.«порог» и «порог», но решение здесь работает.

min_value = 1000

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

print(floor_value)
0 голосов
/ 19 сентября 2018

Ваша структура данных не помогает тому, что вы пытаетесь сделать.Измените его следующим образом:

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]

Но это будет работать, только если вы последовательно произносите threshold .

0 голосов
/ 19 сентября 2018

Попробуйте, если вам нравится

number = 1234
l = [value for value in values if value["threshold"] > number]
floor_value = sorted(l, key = lambda i: i["threshold"])[0]["tax"]
0 голосов
/ 19 сентября 2018

Это один подход.

Демонстрация:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...