如何在 Python 中进行循环子排序?

问题描述

考虑以下最小化示例:

代码:

a = [(1,'A'),(2,(3,(4,(5,'A')]
b = [(1,'B'),'B')]
c = []
d = [(1,'D'),'D')]

print(sorted(a+b+c+d))

结果:

[(1,(1,'A')]

Python 按每个集合的第一项然后按第二项对集合列表进行排序。没关系。 现在,我需要字符串中的第二个排序顺序是“圆形”(不确定这是否是正确的术语)。 此外,我想在新的有序列表中指定最后一个字符串。例如,如果我指定 'B',则有序列表应从 'C' 开始。如果 'C' 不存在,它应该从 'D' 等开始。但是,也可能发生指定字符可能不在列表中的情况,例如如果 'C' 不存在,则新的排序列表仍应从 'D' 开始。

编辑:

抱歉,我没有添加集合列表的所需输出顺序以使其清楚。 假设我会指定 mySpecialSort(myList,'B')。 然后应该首先是所有包含 1 的集合作为最高优先级排序顺序,然后是“循环”字符串(这里从 'D' 开始,因为列表中没有 C ).

所需的排序顺序:

[(1,'A')]

或缩短的可读形式: 1D,1A,1B,2D,2A,2B,3D,3A,3B,4D,4A,5A

我为单个字符列表(此处有重复项)上的“循环”排序提出的(但到目前为止)的(麻烦的)解决方案是以下:

代码:

myList = ['A','D','E','G','Z','A','J','K','T']

def myCircularSort(myList,myLast):
    myListTmp = sorted(list(set(myList + [myLast])))                     # add myLast,remove duplicates and sort
    idx = myListTmp.index(myLast)                                        # get index of myLast
    myStart = myListTmp[(idx+1)%len(myListTmp)]                          # get the start list item
    
    myListSorted = sorted(list(set(myList)))                             # sorted original list
    print("Normal sort:                  {}".format(myListSorted))
    idx_start = myListSorted.index(myStart)                              # find start item and get its index
    myNewSort = myListSorted[idx_start:] + myListSorted[0:idx_start]     # split list and put in new order
    print("Circular sort with {} as last: {}\n".format(myLast,myNewSort))

myCircularSort(myList,'D')
myCircularSort(myList,'X')

结果:

Normal sort:                  ['A','T','Z']
Circular sort with D as last: ['E','D']

Normal sort:                  ['A','Z']
Circular sort with X as last: ['Z','T']    # X actually not in the list

但是,现在我被困在如何将这种“循环”排序(在集合列表的第二项上)与“正常”排序(在集合列表的第一项上)结合起来。>

或者,我可能会想到一种“蛮力”方法来查找最高索引(此处:4)和所有现有字符串(此处:A-Z)和检查两个嵌套 for 循环中每个组合是否存在。 我是在正确的轨道上还是会做一些非常复杂和低效的事情,或者我是否缺少一些智能的 Python 功能?

编辑 2:

经过一些进一步的搜索,我猜 lambdacmp(x,y) 会完成这项工作(参见 example),但它似乎不再存在于 Python3 中。所以,那么可能是带有 operator.itemgetter()operator.methodcaller() 的东西,我仍然不知道如何使用,因为我错过了很好的例子......

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)