基于另一个列表python的排序列表

时间:2019-06-06 15:53:23

标签: python list sorting

我有以下格式的对象列表:

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,但不确定如何使用-我需要将两个列表压缩在一起,然后对压缩的元组列表进行排序吗?

3 个答案:

答案 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]