Cómo filtrar la lista de diccionarios con valores coincidentes para una clave dada

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)