问题描述
考虑以下最小化示例:
代码:
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:
经过一些进一步的搜索,我猜 lambda
和 cmp(x,y)
会完成这项工作(参见 example),但它似乎不再存在于 Python3 中。所以,那么可能是带有 operator.itemgetter()
或 operator.methodcaller()
的东西,我仍然不知道如何使用,因为我错过了很好的例子......
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)