AJG*_*519 3 python sorting secondary-sort
说我有以下列表:
List1=['Name1','Name3','Color1','Size2','Color3','Color2','Name2','Size1', 'ID']
List2=['ID','Color1','Color2','Size1','Size2','Name1','Name2']
Run Code Online (Sandbox Code Playgroud)
每个列表将具有名为"ID"变量的元素,然后是3个其他类别(名称,颜色和大小),其中每个类别中具有未确定数量的元素.
我想对这些变量进行排序,而不知道每个类别中将包含以下"排序列表"的数量:
SortList=['ID','Name','Size','Color']
Run Code Online (Sandbox Code Playgroud)
我可以得到所需的输出(见下文),虽然我想有更好/更pythonic的方式这样做.
>>> def SortMyList(MyList,SortList):
... SortedList=[]
... for SortItem in SortList:
... SortItemList=[]
... for Item in MyList:
... ItemWithoutNum="".join([char for char in Item if char.isalpha()])
... if SortItem==ItemWithoutNum:
... SortItemList.append(Item)
... if len(SortItemList)>1:
... SortItemList=[SortItem+str(I) for I in range(1,len(SortItemList)+1)]
... for SortedItem in SortItemList:
... SortedList.append(SortedItem)
... return SortedList
...
>>>
>>> SortMyList(List1, SortList)
['ID', 'Name1', 'Name2', 'Name3', 'Size1', 'Size2', 'Color1', 'Color2', 'Color3']
>>> SortMyList(List2, SortList)
['ID', 'Name1', 'Name2', 'Size1', 'Size2', 'Color1', 'Color2']
>>>
Run Code Online (Sandbox Code Playgroud)
有关如何改进我的方法或代码的任何建议?
您可以使用自定义键功能对列表进行排序,该功能返回2元组,用于主要排序和二级排序.
主要排序是按照"标签"的顺序排列的(首先是ID,然后是名称等).二级排序是通过它后面的数值.
tags = ['ID','Name','Size','Color']
sort_order = { tag : i for i,tag in enumerate(tags) }
def elem_key(x):
for tag in tags:
if x.startswith(tag):
suffix = x[len(tag) : ]
return ( sort_order[tag],
int(suffix) if suffix else None )
raise ValueError("element %s is not prefixed by a known tag. order is not defined" % x)
list1.sort(key = elem_key)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
174 次 |
| 最近记录: |