[英]How sort specific items in specific order in a list
大家好,我正在嘗試一種算法,以特定順序對特定項目進行排序。 假設我們有一個項目列表: [1, 2, 1, 3, 3, 3, 2, 2, 2, 2, 2, 1, 3, 2, 2, 1] 共有三種不同類型的項目此處:1、2 和 3。我想對這個列表進行排序,以便得到一系列遵循相同類型的項目。 在排序過程中我們不能移動位置的項目,我們只能刪除一些項目,結果應該是最長的。 這個算法的結果應該是:
[1, 1, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2] 我不知道為什么我的算法不起作用:
# start list
givenList = [1, 2, 1, 3, 3, 3, 2, 2, 2, 2, 2, 1, 3, 2, 2,1]
# whish list (just for an example)
whish = [1, 1, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2]
# list grouped by items ( [ [1], [2], [1], [3, 3, 3], [2, 2, 2, 2, 2] ....])
sortedList = []
# we group the elements
lastElement=0
for currentElement in givenList :
if currentElement != lastElement :
sortedList.append([currentElement])
lastElement=currentElement
else : sortedList[-1].append(currentElement)
# we print the grouped items
for index, element in enumerate(sortedList) :
print("Bloc : ", index , " contient : " , element)
# we sort the same elements by group
result=[]
for index, element in enumerate(sortedList) :
# we pass if it's the first group because he has no backward element
if(index == 0) : continue
# we pass if it's the last group because he has no afterward element
if(index == len(sortedList) - 1) : continue
# backward group
backwardList = sortedList[index - 1]
# current group
currentList = sortedList[index]
# afterward group
forwardList = sortedList[index + 1]
# if the backward groupelement type is the same as the forward
if backwardList[0] == forwardList[0] :
# and if the backwardlist contains more element that the current group
if(len(backwardList) >= len(currentList)) :
# we add the concatenation of the backwards and the forwards group
result.append(backwardList + forwardList)
elif backwardList[0] != forwardList[0] :
# else we just add the current group
result.append(currentList)
# we degroup the grouped and sorted list
resultSorted=[]
for e in result:
for i in e:
resultSorted.append(i)
#
print("#"*20)
print("Given : ", givenList)
print("Whish : ", whish)
print("Result : ", resultSorted)
print("#"*20)
您可以使用itertools.groupby
嘗試此實現:
from itertools import groupby
l = [1, 2, 1, 3, 3, 3, 2, 2, 2, 2, 2, 1, 3, 2, 2, 1]
def get_max(elems, current_elems=None):
if current_elems is None:
current_elems = []
for idx, (color, count) in enumerate(elems):
if color in [c for c, _ in current_elems[:-1]]:
continue
yield current_elems + [(color, count)]
yield from get_max( elems[idx+1:], current_elems + [(color, count)] )
elems = [(v, sum(1 for _ in g)) for v, g in groupby(l)]
l, _ = max(((v, sum(c for _, c in v)) for v in get_max(elems)), key=lambda k: k[1], default=[[], None])
out = []
for v, g in groupby(l, key=lambda k: k[0]):
for _, c in g:
out.extend([v] * c)
print(out)
印刷:
[1, 1, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2]
其他測試用例:
l = [1, 2, 3] # [1, 2, 3]
l = [1, 2, 3, 1, 1] # [2, 3, 1, 1]
最好的解決辦法是:
def solve(l):
def aux(i, current, exclude):
if i==len(l):
return []
val = l[i]
if val in exclude:
return aux(i+1, current, exclude)
elif val == current:
return [val] + aux(i+1, current, exclude)
else:
exclude.add(current)
s1 = [val] + aux(i+1, val, exclude)
exclude.remove(current)
s2 = aux(i+1, current, exclude)
if len(s1)>len(s2):
return s1
return s2
return aux(0, -1, set())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.