使用另一个列表在Python列表中对字符串进

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)

有关如何改进我的方法或代码的任何建议?

shx*_*hx2 5

您可以使用自定义键功能对列表进行排序,该功能返回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)