在 Python 中使用自定义顺序对列表进行排序

问题描述 投票:0回答:5

我有一个清单

mylist = [['123', 'BOOL', '234'], ['345', 'INT', '456'], ['567', 'DINT', '678']]

我想按照 1.

DINT
2.
INT
3.
BOOL

的顺序排序

结果:

[['567', 'DINT', '678'], ['345', 'INT', '456'], ['123', 'BOOL', '234']]

我在 stackoverflow 中看到过其他类似的问题,但没有任何类似或容易适用于我。

python list sorting python-2.7
5个回答
79
投票
SORT_ORDER = {"DINT": 0, "INT": 1, "BOOL": 2}

mylist.sort(key=lambda val: SORT_ORDER[val[1]])

我们在这里所做的就是通过为列表中的每个元素而不是整个列表返回一个整数来提供一个新元素进行排序。我们可以使用内联三元表达式,但这会有点笨拙。


2
投票

另一种方式可能是;在列表中设置您的订单:

indx = [2,1,0]

并根据您想要的订单创建一个新列表:

mylist = [mylist[_ind] for _ind in indx]

Out[2]: [['567', 'DINT', '678'], ['345', 'INT', '456'], ['123', 'BOOL', '234']]

0
投票

因为这不是按字母顺序排列的,所以我认为没有一个函数可以对其进行排序,但您可以做的是创建一个新列表,然后追加。这是一种廉价的方法;但它完成了工作。

newlist=[];
for sub_list in mylist:
     if(sub_list[1] == 'DINT']):
          newlist.append(sub_list);

for sub_list in mylist:
     if(sub_list[1] == 'INT']):
         newlist.append(sub_list);

for sub_list in mylist:
     if(sub_list[1] == 'BOOL']):
            newlist.append(sub_list);

0
投票

您可以通过列表定义显式顺序:

def explicit_order(xs):
    """Return a key function that, when passed to sort or sorted, will sort
    the elements in the order they appear in this list.
    """
    keys = {x: i for i, x in enumerate(xs)}
    def key_function(x):
        return keys[x]
    return key_function

order = explicit_order(['DINT', 'INT', 'BOOL'])
sorted(['BOOL', 'INT'], key=order) # = ['INT', 'BOOL']

由于在您的示例中,您还必须从元组中提取字符串,因此您将拥有一个稍微复杂的键函数:

sorted(mylist, key=lambda x: order(x[1]))

-1
投票
     python 3.2

    1. sorted(mylist,key=lambda x:x[1][1])

    2. sorted(mylist,reverse=True)
© www.soinside.com 2019 - 2024. All rights reserved.