How to filter a list of dictionaries with corresponding values ​​for a given key

With an interface, for example 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'}] 

dictlist is actually an instance of csv.DictReader .

+6
source share
5 answers

Update: given the re-asked OP question:

 def copyf(dictlist, key, valuelist): return [dictio for dictio in dictlist if dictio[key] in valuelist] 
+12
source

This may not be the best solution, but here we go:

 >>> 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'}] >>> 
+6
source

Sort of

 new_dict = dict((k, v) for k,v in old_dict.items() if v in allowed_values) 

?

+2
source

Clean and tidy using filter and lambda

 >>> def copyf(dictlist, key, valuelist): ... filter(lambda d: d[key] in valuelist, dictlist) 
+1
source

I prefer

filter (lambda d: value in d [key], dictlist)

-1
source

Source: https://habr.com/ru/post/886520/


All Articles