2016-06-16 8 views
3

1_2のように、parent.id_child.idという形式のアイテムのリストを取得しています。親の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])] 

あなたは、全体の入力リストをソートを回避し、唯一のグループ化を行うために辞書を使用して小さなグループを並べ替えることができます。あなたのidのサイズにDependending、あなたは(テキストソートが辞書順に行われているため)だけでなく、数値あなたのIDをソートしたい場合があります:Pythonの2で

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]))] 

、中間の構築を避けるために、むしろitems()よりもiteritems()を使用しますリスト。

+0

優秀な回答!ありがとう – Yasel

関連する問題