2016-02-28 78 views
-1

編輯:這個問題是一個完整的混亂。答案實際上比問題本身能更好地解釋問題。有沒有辦法通過「謂詞」列表來排序字符串列表?

我有一個對象列表。

['BODY.H','BODY.VL','WHL0.H','BODY.M']

但這個名單將永遠是正確的順序我想要的。我想有這些字符串的方式排序,如本

['BODY.H','BODY.M','BODY.VL','WHL0.H']

BODY.H總是會在索引0,BODY.M總是會在索引1等

有沒有一種方法,我可以根據謂詞列表排序列表? (例如['BODY.H','BODY.M'])。我還沒有嘗試過任何東西,因爲我不知道從哪裏開始。

+0

這是沒有足夠的信息,它可能是很好的包括您使用的代碼與實際結果和所需的行爲。另請參見[如何創建最小,完整和可驗證的示例](http://stackoverflow.com/help/mcve) –

+0

問題是我不知道從哪裏開始。 – aaro4130

+0

沒有人能夠幫助你,除非你更清楚地解釋你的問題... –

回答

0

對不起初步問題的困惑。當我花了心思的話,我最終想出來:)

def reorder_object_list(lst,pred): 
return_list = [None] * len(pred) 
for v in lst: 
    try: 
     return_list[pred.index(v)] = v 
    except: 
     #not found in predicate list 
     return_list.append(v) 
return [x for x in return_list if x != None] 

list = ["HLIGHT_L","BODY_H","BODY_VL","TLIGHT_L","BODY_M"] 
pred = ["BODY_H","BODY_M","BODY_VL","HLIGHT_L","TLIGHT_L"] 
reordered = reorder_list(list,pred) 
for v in reordered: 
    print(v) 
+0

您的示例的問題在於,如果您的謂詞列表與您擁有的列表相同,那麼您可以直接創建列表。如果你想要一個更通用的方法來排序謂詞列表,請參閱下面的/上面的答案。 – aneroid

+0

我意識到它只是在我發佈答案後,更新到應該修復的東西 – aaro4130

+0

由於在'return_list [pred.index(v.name)]'這一行中,如果同一對象出現多個次,它會覆蓋該索引,因爲它在謂詞列表中是相同的索引。所以如果有3個「BODY_H」對象,你的返回列表將只有一個。 – aneroid

1

(你已經改變了你的問題想用字符串,而不是與對象做到這一點,所以這個例子是字符串。)

使用每個字符串的索引列表謂詞提供key依據其進行排序您定列表:

>>> wanted_order = ['BODY.H', 'BODY.M', 'BODY.VL', 'WHL0.H'] 
>>> got_list = ['WHL0.H', 'BODY.H', 'BODY.VL', 'BODY.VL', 'WHL0.H', 'BODY.M'] 
>>> sorted(got_list, key=lambda s: wanted_order.index) 
['BODY.H', 'BODY.M', 'BODY.VL', 'BODY.VL', 'WHL0.H', 'WHL0.H'] 

請注意,我在got_list添加了一些額外的重複項目,以顯示它如何會使用通用輸入和多個每個。

順便說一句,如果總是隻有這4個對象,爲什麼不用這4個創建一個列表呢?

另外,如果從謂詞中缺少一個字符串,則會出現錯誤。所以也許把它放在一個函數(而不是lambda)中,如果發生錯誤,並且返回另一個值。

編輯:

對於你願意,你可以使用s.name密鑰和謂語什麼對象版本(當然,wanted_order有對象的名稱):

>>> sorted(got_list, key=lambda s: wanted_order.index(s.name)) 

編輯2:

要處理got_list中沒有「姓名」的項目wanted_order

>>> def predicated_key(item): 
...  wanted_order = ['BODY.H', 'BODY.M', 'BODY.VL', 'WHL0.H'] 
...  # put wanted_order in global scope if you prefer instead of here 
...  try: 
...   return wanted_order.index(item) # or item.name in your case 
...  except ValueError: 
...   return len(wanted_order) # since this will be higher than the 
...         # index of the any item on the list 
... 
>>> got_list = ['WHL0.H', 'BODY.H', 'something', 'BODY.VL', 
...    'something else', 'BODY.VL', 'WHL0.H', 'BODY.M'] 
>>> sorted(got_list, key=predicated_key) 
['BODY.H', 'BODY.M', 'BODY.VL', 'BODY.VL', 'WHL0.H', 'WHL0.H', 'something', 'something else'] 
+0

如果我在'wanted_order'中不存在的'got_list'中提供了一個名字,這裏會發生什麼? – aaro4130

+1

這已經在我的答案中解決了。 _「另外,如果你的謂詞中缺少一個字符串,你會得到一個錯誤,所以可能把它放在一個函數中(而不是lambda),並在發生錯誤時捕獲該錯誤,並返回另一個值。在這種情況下,您可以返回一個非常高的值或'len(predicate_list)'。所以他們都會被放在最後,並按照它們在原始列表中的順序排列。 – aneroid

+0

沒有注意到,也適用於編輯版本的答案。 – aaro4130

相關問題