Как отфильтровать список словарей с соответствующими значениями для данного ключа - PullRequest
6 голосов
/ 23 апреля 2011

С таким интерфейсом, как 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 фактически является csv.DictReader экземпляром.

Ответы [ 5 ]

12 голосов
/ 23 апреля 2011

Обновление: с учетом переизданного вопроса ОП:

def copyf(dictlist, key, valuelist):
      return [dictio for dictio in dictlist if dictio[key] in valuelist]
6 голосов
/ 23 апреля 2011

Вероятно, не лучшее решение, но здесь мы идем:

>>> 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'}]
>>> 
2 голосов
/ 23 апреля 2011

Что-то вроде

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

1 голос
/ 20 января 2015

Чисто и опрятно, используя фильтр и лямбда

>>> def copyf(dictlist, key, valuelist):
...     filter(lambda d: d[key] in valuelist, dictlist)
0 голосов
/ 23 июня 2016

Я предпочитаю

фильтр (лямбда d: значение в d [ключ], dictlist)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...