我有以下格式的对象列表:
obj = [{"id": 39, "name":"bla"},{"id": 23, "name":"blabla"},{"id": 45, "name":"blabla"},{"id": 12, "name":"blabla"},{"id": 100, "name":"blabla"},...]
我还有一个ID(A
)列表,定义如下:
A = [23,39,45,...]
我需要对obj
进行排序,以使所有排序都反映A
的顺序-第一个对象是具有键23
的对象,第二个对象是具有键{{1}的对象}等。
我正在考虑为此使用39
,但不确定如何使用-我需要将两个列表压缩在一起,然后对压缩的元组列表进行排序吗?
答案 0 :(得分:2)
首先构造一个映射,使您可以通过其ID查找项目:
MarkerName Allele1 Allele2 Weight Zscore P-value Direction
rs7210970 a g 2.00 1.724 0.08462 ++
rs8065651 t c 2.00 -1.345 0.1787 --
然后从此映射中一个接一个地选择它们:
Application.Median(Range("BY" & ActiveCell.Row - CptM & ":BY" & ActiveCell.Row))
答案 1 :(得分:1)
您可以enumerate
A
并跟踪dict
中的索引:
order = {val:i for i, val in enumerate(A)}
# second arg in get could be for any invalid entries
x = sorted(obj, key = lambda x: order.get(x['id'], 99))
# [{'id': 23, 'name': 'blabla'}, {'id': 39, 'name': 'bla'}, {'id': 45, 'name': 'blabla'}, {'id': 12, 'name': 'blabla'}, {'id': 100, 'name': 'blabla'}]
现在它将按A
中的位置排序。但是,如果A
中有重复项,则将元素的 last 索引作为排序顺序:
# no dupes
{x: i for i, x in enumerate([1,2,3])}
# {1: 0, 2: 1, 3: 2}
# dupes
{x: i for i, x in enumerate([1,2, 1, 3])}
# {1: 2, 2: 1, 3: 3}
哪怕您要设置相反的符号,也要在2之后加上1个
答案 2 :(得分:0)
从obj创建字典,然后按照所需顺序构建列表
d = {item['id']: item for item in obj}
new_list = [d[i] for i in A]