代码之家  ›  专栏  ›  技术社区  ›  Moni

从两个列表中找出最大值,对照另一个列表中的对应值进行检查,分配它,然后对第二大值执行相同操作,以此类推

  •  -1
  • Moni  · 技术社区  · 6 年前

    我有两个列表:

    a = [3, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0]
    b = [2, 2, 3, 3, 0, 0, 0, 0, 0, 0, 0]
    

    我想找到两个列表中的最大值,并将其与 另外 列表例如,如果最大值在列表a中,而列表b中的对应值较小,则需要将最大值的索引分配给该列表的主列表:

    a_master = []
    b_master = []
    

    如果其对应项等于最大值,则不执行任何操作,并对下一个最大值重复该过程,但忽略已分配给主列表的索引。 因此,在本例中,初始最大值为3,且a[0]>b[0]表示将索引0附加到a\U主列表。接下来,我们看到b[2]>因此,我们将索引2附加到b\U主列表中。a[3]=b[3],所以我们不分配任何东西。

    现在对下一个最大值重复此过程:2。a[2]=2,但索引2已分配,因此应忽略。b[0]=2,但也已分配。b【1】=2>因此,索引1被分配给b\U主机。

    由于所有剩余值都与对应值相等,我们完成了,生成的主列表如下:

    a_master = [0]
    b_master = [2, 1]
    

    这是最令人赞叹的pythonian答案!

    1 回复  |  直到 6 年前
        1
  •  2
  •   RoadRunner    6 年前

    排序呢 a 事先分成两对元组 (index, element) ,并将其与第二个列表进行比较:

    from operator import itemgetter
    
    a = [3, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0]
    b = [2, 2, 3, 3, 0, 0, 0, 0, 0, 0, 0]
    
    sorted_a = sorted(enumerate(a), key=itemgetter(1), reverse=True)
    # [(0, 3), (3, 3), (2, 2), (1, 1), (4, 0), (5, 0), (6, 0), (7, 0), (8, 0), (9, 0), (10, 0)]
    
    a_master = []
    b_master = []
    for i, x in sorted_a:
        if x > b[i]:
            a_master.append(i)
        elif x < b[i]:
            b_master.append(i)
    
    print(a_master)
    print(b_master)
    

    其输出:

    [0]
    [2, 1]