Вы можете избавиться от функций next()
, всегда возвращая итератор вместо списка. Затем вы можете либо позвонить next()
или list()
на возвращаемое значение. В целом, вы можете потребовать, чтобы функция вызывалась с аргументами ключевых слов, представляющих ключи, которые вы хотите сопоставить, с ключом, который вы хотите вернуть. Подпись будет выглядеть так:
def pluckFilter(ds, key, **filters):
И вы можете назвать ее так:
pluckFilter(listOfDicts, 'object', subject = 'subjectValue2', prediction = 'predictionValue' )
Это позволит сделать довольно простую реализацию (хотя вам может потребоваться проверить ввод):
listOfDicts = [{
"subject" : "subjectValue",
"object" : "objectValue",
"prediction" : "predictionValue"
},
{
"subject" : "subjectValue2",
"object" : "objectValue",
"prediction" : "predictionValue"
}
]
def pluckFilter(ds, key, **filters):
filtered = filter(lambda d: all(d[filt] == filters[filt] for filt in filters), ds)
return map(lambda d: d[key], filtered)
list(pluckFilter(listOfDicts, 'subject', object = 'objectValue', prediction = 'predictionValue' ))
# ['subjectValue', 'subjectValue2']
next(pluckFilter(listOfDicts, 'subject', object = 'objectValue', prediction = 'predictionValue' ))
# 'subjectValue'
list(pluckFilter(listOfDicts, 'object', subject = 'subjectValue2', prediction = 'predictionValue' ))
# ['objectValue']