【问题标题】:Sorting a list based on values from another list and excluding elements in list from the sort?根据另一个列表中的值对列表进行排序并从排序中排除列表中的元素?
【发布时间】:2021-02-02 07:49:00
【问题描述】:

为了绘制瀑布图,我创建了三个列表作为输入:值、条形文本、轴文本。 我的目标是对第一个和最后一个元素之间的每个数字进行升序排序,即从排序中排除列表中的第一个和最后一个元素。

我有三个包含以下元素的列表:

A = [50000,8000,-3000,-4000,51000]
B = ['Start','Profit1','Cost2','Cost1','End']
C = ['50K','8k','-3k','-4k','51k']

使用建议的方法here(按其他列表对列表中的值进行排序),我声明:

a_new = sorted(A)
b_new = [x for _, x in sorted(zip(A, B))]
c_new = [x for _, x in sorted(zip(A, C))]
print(a_new)
print(b_new)
print(c_new)

并作为输出接收:

[-4000, -3000, 8000, 50000, 51000]
['Cost1', 'Cost2', 'Profit1', 'Start', 'End']
['-4k', '-3k', '8k', '50K', '51k']

不过,我的目标是修复列表的第一个和最后一个元素,并仅对所有其他元素进行排序。期望:

[50000,-4000,-3000,8000,51000]
['Start','Cost1', 'Cost2', 'Profit1','End']
['50K','-4k', '-3k', '8k','51k']

我想我已经接近解决方案了,但已经在这里停留了很长一段时间......

【问题讨论】:

    标签: python pandas list dataframe sorting


    【解决方案1】:

    你可以在你想要的部分使用np.argsort

    order = np.r_[0,np.argsort(A[1:-1]) + 1, len(A)-1]
    a_new = np.array(A)[order]
    b_new = np.array(B)[order]
    c_new = np.array(C)[order]
    

    输出:

    [50000 -4000 -3000  8000 51000]
    ['Start' 'Cost1' 'Cost2' 'Profit1' 'End']
    ['50K' '-4k' '-3k' '8k' '51k']
    

    【讨论】:

    • 嘿,非常感谢,这很好用!有没有办法对值进行降序排序?
    • @Botan 只是用np.argsort(A[1:-1])[::-1] 恢复部分
    【解决方案2】:

    不太优雅,但我希望这能解决问题:

    A = [50000,8000,-3000,-4000,51000]
    B = ['Start','Profit1','Cost2','Cost1','End']
    C = ['50K','8k','-3k','-4k','51k']
    
    a_new = sorted(A[1:len(A)-1])
    a_new.insert(0, A[0])
    a_new.append(A[len(A)-1])
    b_new = [x for _, x in sorted(zip(A[1:len(A)-1], B[1:len(A)-1]))]
    c_new = [x for _, x in sorted(zip(A[1:len(A)-1], C[1:len(A)-1]))]
    b_new.insert(0, B[0])
    b_new.append(B[len(B)-1])
    c_new.insert(0, C[0])
    c_new.append(C[len(C)-1])
    print(a_new)
    print(b_new)
    print(c_new)
    

    【讨论】:

      【解决方案3】:

      一种丑陋但可能的方式是使用列表indexing

      a_new = [A[0]] + sorted(A[1:-1]) + [A[-1]]
      b_new = [B[0]] + [x for _, x in sorted(zip(A[1:-1], B[1:-1]))] + [B[-1]
      c_new = [C[0]] + [x for _, x in sorted(zip(A[1:-1], C[1:-1]))] + [C[-1]]
      

      对于descending

      a_new = [A[0]] + sorted(A[1:-1], reverse=True) + [A[-1]]
      b_new = [B[0]] + [x for _, x in sorted(zip(A[1:-1], B[1:-1]),reverse=True)] + [B[-1]
      c_new = [C[0]] + [x for _, x in sorted(zip(A[1:-1], C[1:-1]),reverse=True)] + [C[-1]]
      

      升序输出

      [50000, -4000, -3000, 8000, 51000]
      ['Start', 'Cost1', 'Cost2', 'Profit1', 'End']
      ['50K', '-4k', '-3k', '8k', '51k']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-30
        • 2023-04-01
        • 2021-07-14
        • 1970-01-01
        • 2018-11-15
        • 1970-01-01
        相关资源
        最近更新 更多