@FreeDobby
Свободный Добби

Get item by value?

Понадобился вот такой функционал, нигде не нашел, написал сам. Просто интересно может уже он есть в питоне?
def get_item(ld, key, value, default = None):
	for item in ld:
		if item[key] == value:
			return item
	
	return default
	
a = [ { n: 0 }, { n: 1 } ]
print(get_item(a, 'n', 1)) # { n: 1 }
print(get_item(a, 'n', 5)) # None


Или хотя бы если не по ключу фильтровать то просто калбэк функцию передавать, тоже вариант. Типа того:
def get_item(ld, predicate, default = None):
	for item in ld:
		if predicate(item):
			return item
	
	return default

print(get_item(a, lambda item: item['n'] == 1)) # { n: 1 }
print(get_item(a, lambda item: item['n'] == 5)) # None
  • Вопрос задан
  • 220 просмотров
Пригласить эксперта
Ответы на вопрос 2
@deliro
class MyList(list):
    RAISE = object()

    def intersect(self, dct, default=RAISE):
        for item in self:
            if all(item[k] == v for k, v in dct.items()):
                return item
        if default is self.RAISE:
            raise ValueError("Couldn't find")
        else:
            return default

In [6]: l = MyList([{'city': 'moscow', 'name': 'Roman'}])

In [7]: l.intersect({'city': 'moscow'})
Out[7]: {'city': 'moscow', 'name': 'Roman'}

In [8]: l.intersect({'city': 'tomsk'})
ValueError: Couldn't find
Ответ написан
@abcd0x00
>>> lst = [{'n': 0}, {'n': 1}]
>>> 
>>> next(filter(lambda i: i['n'] == 1, lst), None)
{'n': 1}
>>> next(filter(lambda i: i['n'] == 5, lst), None)
>>>


>>> lst = [{'n': 0}, {'n': 1}]
>>> 
>>> next((i for i in lst if i['n'] == 1), None)
{'n': 1}
>>> next((i for i in lst if i['n'] == 5), None)
>>>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы