43743


リスト内にある同じ要素でリストをまとめる方法についての質問です。  
まずは私が書いた書いたコードを下記に示します。

[code]

    # 元データ
    original = [[1,"a"],[1,"b"],[1,"c"],
                [2,"d"],[2,"e"],[2,"f"],
                [3,"g"],[3,"h"],[3,"i"],
                [4,"j"],[4,"k"],[4,"l"],
                [5,"m"],[5,"n"],[5,"o"]]
    
    new_data = [] # 格納先 三重のリストになる
    
    # 同じID毎にまとめる
    before_id = None
    el = []
    for row in original:
        if row[0] != before_id and before_id is not None:
            new_data.append(el)
            el = [row]
        else:
            el.append(row)
        before_id = row[0]
    new_data.append(el)
    
    print(new_data)
    
    実行結果
    [[[1, 'a'], [1, 'b'], [1, 'c']], [[2, 'd'], [2, 'e'], [2, 'f']], 
     [[3,   'g'], [3, 'h'], [3, 'i']], [[4, 'j'], [4, 'k'], [4, 'l']], 
     [[5, 'm'], [5, 'n'], [5, 'o']]]
    
[/code]

上のコードのorginalリストのように二重リストの決まったindexにID番号があります。  
例えてば、IDが1のリストは、originalリスト中に3つあるので、これらを纏めて、[[1,"a"],[1,"b"],[1,"c"]]のようなIDで纏めたのリストを作り、最終的には、実行結果のようにID毎に纏めた3重リストを作成したいです。私が書いたコードでも一応、実現できますが、汚いコードなので修正したいです。どなたかもっと良い(スマートな)方法をご教示頂ければ幸いです。  
よろしくお願いします。


CC BY-SA 4.0
2018-05-02T14:31:30.087
43741
2019-02-20T05:42:00.967
2018-05-03T00:41:43.473
21189
21189
question
python
Python 同じある要素を持つリストをまとめる。


スマートかどうかは何とも言えませんが、同じID毎にまとめるのであれば `itertools.groupby` と `operator.itemgetter`
を使うと以下の様にできます。

[code]

    >>> from itertools import groupby
    >>> from operator import itemgetter
    
    >>> [list(grp) for _, grp in groupby(original, key=itemgetter(0))]
    [[[1, 'a'], [1, 'b'], [1, 'c']], [[2, 'd'], [2, 'e'], [2, 'f']], [[3, 'g'], [3, 'h'], [3, 'i']], [[4, 'j'], [4, 'k'], [4, 'l']], [[5, 'm'], [5, 'n'], [5, 'o']]]
    
[/code]


CC BY-SA 4.0
2018-05-02T15:06:12.870
43743
2018-05-02T15:06:12.870
43741
answer


組み込み関数だけを使用して、このように書くこともできます。

[code]

    unique_id = set([row[0] for row in original])
    # unique_id = {1, 2, 3, 4, 5}
    [[row for row in original if row[0] == id] for id in unique_id]
    
[/code]

結果:

[code]

    [[[1, 'a'], [1, 'b'], [1, 'c']], [[2, 'd'], [2, 'e'], [2, 'f']], [[3, 'g'], [3, 'h'], [3, 'i']], [[4, 'j'], [4, 'k'], [4, 'l']], [[5, 'm'], [5, 'n'], [5, 'o']]]
    
[/code]


CC BY-SA 4.0
2019-02-20T05:42:00.967
52893
2019-02-20T05:42:00.967
32250
43741
answer