在 Python 中使用自定义顺序对列表进行排序
Posted
技术标签:
【中文标题】在 Python 中使用自定义顺序对列表进行排序【英文标题】:Sort a list with a custom order in Python 【发布时间】:2012-12-21 21:48:33 【问题描述】:我有一个清单
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']]
我在 *** 中看到了其他类似的问题,但没有任何类似或容易适用于我的问题。
【问题讨论】:
你有一个语法错误:'345 没有关闭。 "我想按照 1.DINT 2.INT 3.BOOL 的顺序对其进行排序"。那是什么顺序?如果我添加另一个项目['317.3', 'FLOAT', '268.0']
,我如何知道它在排序输出中的位置?
@KarlKnechtel 好吧,这个的完整应用是对 REAL(浮点数)、DINT、INT、SINT、BOOL 进行排序。这是我想要的顺序(从大到小)。这里的这个问题仅用于说明目的。 '123'、'234'、'345'……都没有实际意义。
【参考方案1】:
SORT_ORDER = "DINT": 0, "INT": 1, "BOOL": 2
mylist.sort(key=lambda val: SORT_ORDER[val[1]])
我们在这里所做的只是通过为列表中的每个元素而不是整个列表返回一个整数来提供一个新元素进行排序。我们可以使用内联三元表达式,但这会有点笨拙。
【讨论】:
@SeanVieira,如果您有排序顺序,但有时并非所有键都在我们要排序的列表中,您将如何扩展它? Python 有一个.get
可以使用字典的方法,所以你可以做lambda val: SORT_ORDER.get(val[1], "MY DEFAULT SORT ORDER VALUE")
@joddm
很好,但以此为灵感,我更喜欢SORT_ORDER = ["DINT", "INT", "BOOL"]
mylist.sort(key=lambda val: SORT_ORDER.index(val))
。我想也许这不如使用索引那么快?但它似乎更容易解释。【参考方案2】:
另一种方式可能是;在列表中设置您的订单:
indx = [2,1,0]
并根据您的订单创建一个新列表:
mylist = [mylist[_ind] for _ind in indx]
Out[2]: [['567', 'DINT', '678'], ['345', 'INT', '456'], ['123', 'BOOL', '234']]
【讨论】:
【参考方案3】:由于这不是 aphabetical 顺序,我认为没有一个函数可以对其进行排序,但您可以做的是创建一个新列表然后追加。这是一种便宜的方法;但它可以完成工作。
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);
【讨论】:
大括号?from __future__ import braces
;-) 另外,请参阅我的回答 - 您只需遍历列表一次 :-)
是的,我更喜欢其他答案。两线解决方案。
即使这种方法是有道理的,出于对所有神圣事物的热爱,请使用列表推导,或filter
或其他东西。
@KarlKnechtel:我不知道你怎么说,即使这种方法是有意义的......我测试了它并且它有效。但是有一种东西叫做建设性批评。不必对陌生人无礼。
在设置循环时我经常做的一件事是尝试思考如何减少通过数据的次数。在这种情况下,您将循环 3 次以找到三个不同的变量,因此挑战在于找到一种方法,让您可以在一次传递中获取所有信息(因为您将在一次传递中遇到所有变量)。 Sean 的解决方案使用字典来完成此操作,因此每次遇到一个项目时,您都可以准确地知道它的去向。另外,你一定要看看列表推导式——你会很快学会爱上它们:)【参考方案4】:
python 3.2
1. sorted(mylist,key=lambda x:x[1][1])
2. sorted(mylist,reverse=True)
【讨论】:
第一个选项有效,但假定标签名称不会改变。第二个选项不是 OP 想要的。以上是关于在 Python 中使用自定义顺序对列表进行排序的主要内容,如果未能解决你的问题,请参考以下文章