Python - 排序列表
Python - Sorting Lists
我正在尝试使用此代码按多个条件对列表进行排序。
lis = sorted([lsDataSorted[i:i+8] for i in range(0,len(lsDataSorted),8)],key=lambda x:(x[7],int(x[5])-int(x[6]),x[5],x[0]),reverse=True)
现在,我们不必费心谈论每个对象是什么,但我们看到我有一个 "reverse" 排序功能。现在,我的最后一个条件 x[0]
恰好是一个名称列表。通过使用 reverse=True
,我们知道排序将以相反的顺序 (z-a)。我的问题是,我可以 "reverse" 仅针对最后一种情况恢复正常吗?如果是,那又如何?
我建议将 lsDataSorted
的每个块包装到一个自定义 class 中,这将根据您的复杂条件强制进行比较。例如:
import functools
@functools.total_ordering
class Compare(object):
def __init__(self, chunk):
self.x = chunk[7], int(chunk[5]) - int(chunk[6]), chunk[5]
self.y = chunk[0]
def __eq__(self, other):
return (self.x==other.x) and (self.y==other.y)
def __lt__(self, other):
if self.x != other.x:
return self.x < other.x
return self.y > other.y
现在,
lis = sorted([lsDataSorted[i:i+8]
for i in range(0,len(lsDataSorted),8)],
key=Compare, reverse=True)
应该会为您提供您显然正在寻找的混合复杂排序。
我正在尝试使用此代码按多个条件对列表进行排序。
lis = sorted([lsDataSorted[i:i+8] for i in range(0,len(lsDataSorted),8)],key=lambda x:(x[7],int(x[5])-int(x[6]),x[5],x[0]),reverse=True)
现在,我们不必费心谈论每个对象是什么,但我们看到我有一个 "reverse" 排序功能。现在,我的最后一个条件 x[0]
恰好是一个名称列表。通过使用 reverse=True
,我们知道排序将以相反的顺序 (z-a)。我的问题是,我可以 "reverse" 仅针对最后一种情况恢复正常吗?如果是,那又如何?
我建议将 lsDataSorted
的每个块包装到一个自定义 class 中,这将根据您的复杂条件强制进行比较。例如:
import functools
@functools.total_ordering
class Compare(object):
def __init__(self, chunk):
self.x = chunk[7], int(chunk[5]) - int(chunk[6]), chunk[5]
self.y = chunk[0]
def __eq__(self, other):
return (self.x==other.x) and (self.y==other.y)
def __lt__(self, other):
if self.x != other.x:
return self.x < other.x
return self.y > other.y
现在,
lis = sorted([lsDataSorted[i:i+8]
for i in range(0,len(lsDataSorted),8)],
key=Compare, reverse=True)
应该会为您提供您显然正在寻找的混合复杂排序。