2016-06-16 122 views
3

我收到格式爲parent.id_child.id的項目列表,如1_2。我嘗試通過父母ID對孩子的ID進行分組,例如: 來自輸入['1_2', '2_2', '1_1', '2_1', '1_3']我需要輸出[['1','2','3'], ['1','2']]。 我曾嘗試這樣的:正確使用itertools groupby創建列表

inputlist = ['1_2', '1_1', '2_1', '1_3', '2_2' ] 
outputlist= [item.split('_') for item in inputlist] 
outputlist.sort() 
final = [list(group) for key, group in itertools.groupby(outputlist, lambda x: x[0])] 

這組中的元素,通過我需要僅獲得每一個項目的第二元件。我怎樣才能做到這一點?另外,我可以在單個列表理解句中完成整個事情嗎?

回答

2

使用列表理解,是的;值本身傳遞到每個組迭代不變,所以你需要再次進行選擇:

final = [[g[1] for g in group] for key, group in itertools.groupby(outputlist, lambda x: x[0])] 

您可以通過嵌套分裂成groupby呼叫做整個事情在一個單一的表達,但是這個變得相當難看快,即使在多行拆分:

final = [ 
    [g[1] for g in group] 
    for key, group in itertools.groupby(
     sorted(item.split('_') for item in inputlist), 
     lambda x: x[0])] 

你可以避開排序整個輸入列表並使用字典做分組中的小團體只進行排序。 Dependending你的ID的大小,您可能希望你的IDS 數字以及(因爲文本排序排在最後完成)排序:

per_parent = {} 
for item in inputlist: 
    parent, child = item.split('_', 1) 
    per_parent.setdefault(parent, []).append(child) 
final = [children for parent, children in sorted(
    per_parent.items(), key=lambda pc: int(pc[0]))] 

在Python 2,使用iteritems()而不是items()行動,以避免中間名單。

+0

優秀的答案!謝謝 – Yasel