【问题标题】:How to custom sort a multidimensional list with given label in Python如何在Python中使用给定标签自定义排序多维列表
【发布时间】:2015-02-06 19:05:57
【问题描述】:

如何按我想要的顺序自定义排序多维列表? (不使用任何外部模块或库)

例如,我有一个多维列表:

[['M', 'A', 'R', 'K']
[1,    3,   5,    4]
[2,    6,   7,    8]]

我想将其列按 R、K、A、M 顺序排序,例如:

[['R', 'K', 'A', 'M']
[5,    4,   3,    1]
[7,    8,   6,    2]]

我只知道如何使用此代码按字母顺序对列表进行排序:

sorted_l = [i for i in zip(*sorted(zip(*l)))]

生成以下结果:

[['A', 'K', 'M', 'R']
[3,    4,   1,    5]
[6,    8,   2,    7]]

谢谢!

【问题讨论】:

  • 使用什么条件下单才能得到这个订单['R', 'K', 'A', 'M']
  • @Marcin 我将有一个字符串用户输入,我可以按照我想要的方式自定义对这个多维列表的列进行排序。例如字符串 = RKAM;字符串 = AKRM; string = RKAM 无论我想要什么顺序。
  • @falsetru 不,我希望它按列排序

标签: python algorithm list sorting multidimensional-array


【解决方案1】:

使用nested list comprehension:

>>> l = [['M', 'A', 'R', 'K'],
...      [1,    3,   5,    4],
...      [2,    6,   7,    8]]
>>> indexes = [2, 3, 1, 0]
>>> [[row[i] for i in indexes] for row in l]
[['R', 'K', 'A', 'M'],
 [5, 4, 3, 1],
 [7, 8, 6, 2]]

【讨论】:

    【解决方案2】:

    使用itemgetter的替代方法

    l = [['M', 'A', 'R', 'K'],
        [1,    3,   5,    4],
        [2,    6,   7,    8]]       
    
    from operator import itemgetter    
    
    itg = itemgetter(2, 3, 1, 0)   
    print([itg(row) for row in l])
    

    给予:

       [('R', 'K', 'A', 'M'), (5, 4, 3, 1), (7, 8, 6, 2)]
    

    samae itg 也可以使用新的“标题”顺序构造,例如

    a_string = "RKAM"
    itg = itemgetter(*[l[0].index(v) for v in a_string])
    

    【讨论】:

    • 我认为重点是能够使用字母来索引数组
    • 也许,它并不清楚 OP 想要如何对列表进行排序。
    【解决方案3】:

    转置它,把它变成dict,找到列然后转置回来

    >>> L = [['M', 'A', 'R', 'K'],
    [1,    3,   5,    4],
    [2,    6,   7,    8]]
    >>> cols = dict((x[0], x) for x in zip(*L))
    >>> zip(*[cols[k] for k in ('R', 'K', 'A', 'M')])
    [('R', 'K', 'A', 'M'), (5, 4, 3, 1), (7, 8, 6, 2)]
    

    【讨论】:

      【解决方案4】:
      l= [['M', 'A', 'R', 'K'],[1,    3,   5,    4],[2,    6,   7,    8]]
      inds = "RKAM"
      
      print(sorted(zip(*l),key=lambda x: inds.index(x[0])))
      [('R', 5, 7), ('K', 4, 8), ('A', 3, 6), ('M', 1, 2)]
      
      print(zip(*sorted(zip(*l),key=lambda x: inds.index(x[0]))))
      
      [('R', 'K', 'A', 'M'), (5, 4, 3, 1), (7, 8, 6, 2)]In [6]: trans = 
      
      In [6]: trans = sorted(zip(*l),key=lambda x: inds.index(x[0]))    
      In [7]: trans[0] # each 0 in  inds.index(x[0]) is either R,K, A or M
      Out[7]: ('R', 5, 7)
      In [8]: trans[1]
      Out[8]: ('K', 4, 8)
      In [9]: trans[2]
      Out[9]: ('A', 3, 6)    
      In [10]: trans[3]
      Out[10]: ('M', 1, 2)
      
      In [11]: zip(*trans) # finally transpose sorted columns again
      Out[11]: [('R', 'K', 'A', 'M'), (5, 4, 3, 1), (7, 8, 6, 2)]
      

      【讨论】:

      • @MarlonC.Carrillo,我们首先转置并根据它们在我们的 inds 字符串中的索引/位置按每列中的第一个元素对列进行排序,外部 zip 只是再次转置列表。如果['M', 'A', 'R', 'K'] 在第二行,您可以使用inds.index(x[1])
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      • 2015-02-09
      • 2020-11-07
      • 1970-01-01
      • 2020-05-27
      • 2021-12-25
      • 1970-01-01
      相关资源
      最近更新 更多