Con una interfaz como a = copyf(dictlist, key, valuelist)
.
>>> dictlist = [{'first': 'James', 'last': 'Joule'}, {'first': 'James', 'last': 'Watt'}, {'first': 'Christian', 'last': 'Doppler'}] >>> valuelist = ['James', 'John'] >>> x = copyf(dictlist, 'first', valuelist) >>> print(x) [{'first': 'James', 'last': 'Joule'}, {'first': 'James', 'last': 'Watt'}]
La lista de dictlist
es efectivamente una instancia de csv.DictReader
.
Actualización: teniendo en cuenta la pregunta reeditada del OP:
def copyf(dictlist, key, valuelist): return [dictio for dictio in dictlist if dictio[key] in valuelist]
Probablemente no sea la mejor solución, pero aquí vamos:
>>> def copyf(data, key, allowed): ... return filter(lambda x: key in x and x[key] in allowed, data) ... >>> dictlist = [{'first': 'James', 'last': 'Joule'}, {'first': 'James','last': 'Watt'},{'first': 'Christian','last': 'Doppler'}] >>> copyf(dictlist, 'first', ('Christian',)) [{'last': 'Doppler', 'first': 'Christian'}] >>> copyf(dictlist, 'last', ('Christian',)) [] >>> copyf(dictlist, 'first', ('James',)) [{'last': 'Joule', 'first': 'James'}, {'last': 'Watt', 'first': 'James'}] >>>
Algo como
new_dict = dict((k, v) for k,v in old_dict.items() if v in allowed_values)
?
Limpio y ordenado, utilizando filtro y lambda.
>>> def copyf(dictlist, key, valuelist): ... filter(lambda d: d[key] in valuelist, dictlist)
yo prefiero
filtro (lambda d: valor en d [clave], dictlist)