Фильтровать массив словарей по значению - PullRequest
0 голосов
/ 16 июня 2020

Я уверен, что на этот вопрос был дан ответ, но я не могу найти пример, и у меня возникли проблемы с его выяснением.

У меня есть массив словарных статей. У каждого дикта есть список команд. Я хочу отфильтровать массив, в котором идентификатор команды отсутствует в списке. Например:

items = [{'teams':[{'id':'a'}]}, {'teams':[{'id':'b'}]}, {'teams':[{'id':'a'},{'id':'b'}]}]

Я хочу отфильтровать массив, чтобы получить только те команды, у которых id равен 'b':

items = filter(items, ...) -> [{'teams':[{'id':'b'}]}, {'teams':[{'id':'a'},{'id':'b'}]}]

Я пробовал это, но не сработало:

items = [a for a in items if lambda x: 'b' in x['teams']]

И

items = filter(items, lambda x: 'b' in x['teams'])

Это не сработало, потому что x ['team'] - это список объектов.

Я хотел бы использовать фильтр или понимание списка.

Ответы [ 3 ]

3 голосов
/ 16 июня 2020

Вы на полпути. Вы можете использовать any и выражение генератора, чтобы проверить, есть ли в командах 'b'.

items = [{'teams':[{'id':'a'}]}, {'teams':[{'id':'b'}]}, {'teams':[{'id':'a'},{'id':'b'}]}]
output = [
   team
   for team in items
   if any(t['id'] == 'b' for t in team['teams'])
]
# [{'teams': [{'id': 'b'}]}, {'teams': [{'id': 'a'}, {'id': 'b'}]}]
1 голос
/ 16 июня 2020

Вот функция, чтобы проверить, есть ли конкретная команда в некотором списке команд:

def contains_team(teams, key):
    return any(team["id"] == key for team in teams)

И вот один из способов ее использования:

items_with_team_b = [x for x in items if contains_team(x["teams"], "b")]
1 голос
/ 16 июня 2020

Вы можете использовать any() с внутренним списком для поиска команд, где any внутренняя команда имеет нужный вам идентификатор:

items = [{'teams':[{'id':'a'}]}, {'teams':[{'id':'b'}]}, {'teams':[{'id':'a'},{'id':'b'}]}]

search = 'b'
list(filter(lambda item: 
        any(team['id'] == search 
        for team in item['teams']), items)
)
# [{'teams': [{'id': 'b'}]}, {'teams': [{'id': 'a'}, {'id': 'b'}]}]

Конечно, вы также можете сделать это как понимание списка если вам не нужна ленивая оценка фильтра.

...