2016-02-28 36 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

相关问题