Как отсортировать один массив объектов по расположению элементов в другом массиве в 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 шт):

Автор решения: splash58

как вариант можно сделать через промежуточный словарь

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)
→ Ссылка
Автор решения: n1tr0xs

Можно так

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']))
→ Ссылка
Автор решения: strawdog

Можно с помощью модуля 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'}]
→ Ссылка