ディクショナリを使用して、アイテムを値のリストにマップすることから始めましょう。これは、リストよりもはるかに簡単 (かつ高速) です。なぜなら、新しい値を追加するリストを特定することはmydict[item]
、ある種の線形検索関数を記述する必要がないからです。
mydict = {}
for item, otherstuff, value in mylist:
mydict.setdefault(item, []).append(value)
これにより、以下が得られます。
{'item1': ['value1', 'value2'], 'item2': ['value3', 'value4']}
必要に応じて、その辞書をリストに戻すことができます。
groupedlist = [[k] + v for k, v in mydict.items()]
これにより、以下が得られます。
[['item2', 'value3', 'value4'], ['item1', 'value1', 'value2']]
ここでの大きな欠点は、物事を dict に貼り付けると、元の順序が失われることです。最初のエントリがの最初のエントリの前に来た (またはの最後のエントリが の後に来た)item1
ため、最初に来ることを期待していた場合は、それを失っています。重要な場合は、.item2
item2
item1
OrderedDict
大きな利点は、多くの場合、最終的にリストではなく辞書が実際に必要になることです。
小さい利点は、データがソートされていないgroupby(…sorted(…))
場合、O(NlogN) ソートが必要であるのに対し、このソリューションは O(N) であるということです。通常、それは違いはありません。もしそうなら、特定の Python 実装とプラットフォームの定数係数の違いは、とにかく違いを上回る可能性があります。ただし、パフォーマンスが重要な場合は、両方のソリューションをテストし、より高速な方を使用してください。