Как отсортировать один массив объектов по расположению элементов в другом массиве в Python?
Всем привет, такая ситуация Есть массив объектов для условности aaa. Есть массив идентификаторов возможных объектов bbb.В массиве aaa могут быть объекты,идентификаторов которых нету в bbb, и наоборот, в bbb могут быть ids, объектов с которыми нету в aaa. Каким образом я могу взять объекты из aaa, которые есть в bbb, еще и расположить в том же порядке, как они быи бы в bbb + применить доп фильтры по которым брать или не брать объект из aaa то есть пример
aaa = [{"id":1; "name": "abc"}, {"id":2; "name": "ggg"}. {"id":3; "name": "yyy"}, {"id":4; "name": "xxx"];
второй массив
bbb = [33,4,55,11,8,1];
результат:
[{"id":4; "name": "xxx"}, {"id":1; "name": "abc"}]
Ответы (3 шт):
как вариант можно сделать через промежуточный словарь
temp = {x['id']: x for x in aaa}
res =[]
for x in bbb:
y = temp.get(x)
if y is not None:
res.append(y)
print(res)
Можно так
lst = []
for a in aaa:
if a['id'] in bbb:
# вот здесь вы можете доролнительно написать свои if-ы, обработать элементы и т.д.
lst.append(a)
lst.sort(key=lambda x: bbb.index(x['id']))
print(lst)
Можно записать это в одну строку:
lst = sorted(filter(lambda x: x['id'] in bbb, aaa), key=lambda x: bbb.index(x['id']))
где вместо lambda x: x['id'] in bbb вы можете записывать вашу собственную функцию фильтрации. например так:
def f(x):
if x['id'] not in bbb:
return False
if x['id'] > 5: # допустим, вам нужны id < 5
return False
return True
lst = sorted(filter(f, aaa), key=lambda x: bbb.index(x['id']))
Можно с помощью модуля pandas:
import pandas as pd
res = pd.DataFrame(index = bbb).join(pd.DataFrame(aaa)
.set_index("id"), how="inner").reset_index().to_dict("records")
res:
[{'index': 4, 'name': 'xxx'}, {'index': 1, 'name': 'abc'}]