Python: фильтрация списков
Имеется список list
df = [
{'A': 'er', 'B': 'po'},
{'A': 'rf', 'B': 'pl'},
{'A': 'ed', 'B': 'fd'}
]
Просьба, подсказать, как можно фильтровать подобный список без использования pandas, при условии что фильтр может примениться как к А так и В или же к обоим сразу, на входные данные список list для примера где А = ['er', 'ed'],
Пробовал собирать функцию с перебором for и проверкой if .. in: в случае где применяется к одному из 2ух ключей фильтрация работает корректно, но при фильтрации по 2ум одновременно ключам результат получается не совсем корректный
мои попытки:
A = ['er', 'ed']
B = []
def filter(A, B):
result = []
if not A:
for fl in A:
for row in df:
if fl in['A']:
result.append(row)
else:
result.append(df)
return result
для единичного, с добавлением фильтрации еще по одному ключу возникает сложности
Ответы (3 шт):
def my_filter(one_argument):
if one_argument['A'] or one_argument['B']:
return False
return True
filter(my_filter,[
{'A': 'er', 'B': 'po'},
{'A': 'rf', 'B': 'pl'},
{'A': 'ed', 'B': 'fd'}
])
функция filter фильтрует список используя пользовательскую функцию my_filter функция my_filter принимает один элемент из списка, в твоём случае этот элемент словарь, следовательно имеет доступ по ключам
Вот решение для двух условий:
df = [
{'A': 'er', 'B': 'po'},
{'A': 'rf', 'B': 'pl'},
{'A': 'ed', 'B': 'fd'}
]
A = ['er', 'rf']
B = ['po', 'fd']
res = [elem for elem in df if (elem['A'] in A and elem['B'] in B) or
(elem['A'] in A and not B) or (elem['B'] in B and not A)]
print(res)
Вроде универсальный oneliner получился. Может фильтровать по любому количеству ключей.
df = [
{'A': 'er', 'B': 'po'},
{'A': 'rf', 'B': 'pl'},
{'A': 'ed', 'B': 'fd'}
]
flt = {'A': ['er', 'ed'],
'B': ['fd']}
res = [d for d in df if all(d[k] in v for k,v in flt.items())]
print(res)
flt = {'A': ['er', 'ed']}
res = [d for d in df if all(d[k] in v for k,v in flt.items())]
print(res)
flt = {'B': ['po', 'pl']}
res = [d for d in df if all(d[k] in v for k,v in flt.items())]
print(res)
[{'A': 'ed', 'B': 'fd'}]
[{'A': 'er', 'B': 'po'}, {'A': 'ed', 'B': 'fd'}]
[{'A': 'er', 'B': 'po'}, {'A': 'rf', 'B': 'pl'}]
Это по И. Если надо по ИЛИ, то использовать any вместо all.