1

次の形式のペア データのネストされたリストがあります。

mylist = [['item1', 'some other stuff', 'value1'],['item1', 'some other stuff', 'value2'],['item2', 'some other stuff', 'value3'],['item2', 'some other stuff', 'value4']]

次のことを行う方法がわかりませんが、次のことを行う必要があります。

リストを次のようにグループ化する必要があります。

[['item1', 'value1', 'value2'], ['item2', 'value3', 'value4']]

したがって、アイテムのリストでは、アイテムがリスト内で異なる値で複数回繰り返される場合、すべての値を対応するアイテムでグループ化する必要があります。

どんな助けでも大歓迎です。

ありがとう

4

2 に答える 2

4

ディクショナリを使用して、アイテムを値のリストにマップすることから始めましょう。これは、リストよりもはるかに簡単 (かつ高速) です。なぜなら、新しい値を追加するリストを特定することは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ため、最初に来ることを期待していた場合は、それを失っています。重要な場合は、.item2item2item1OrderedDict

大きな利点は、多くの場合、最終的にリストではなく辞書が実際に必要になることです。

小さい利点は、データがソートされていないgroupby(…sorted(…))場合、O(NlogN) ソートが必要であるのに対し、このソリューションは O(N) であるということです。通常、それは違いはありません。もしそうなら、特定の Python 実装とプラットフォームの定数係数の違いは、とにかく違いを上回る可能性があります。ただし、パフォーマンスが重要な場合は、両方のソリューションをテストし、より高速な方を使用してください。

于 2013-05-02T23:07:24.233 に答える
2

リストがitertools.groupby最初の項目に従ってソートされていない場合は、最初にソートする必要がある場合があります。O(NlogN)これは、ソートされていないデータとソートされたデータが複雑になることを意味しO(N)ます。

>>> from itertools import groupby
>>> [[k]+[x[-1] for x in v] for k,v in groupby(mylist,key=lambda x:x[0])]
[['item1', 'value1', 'value2'], ['item2', 'value3', 'value4']]

を使用するdefaultdictと、並べ替えられたデータと並べ替えられていないデータの両方でO(N)複雑に機能します。

>>> from collections import defaultdict
>>> dic=defaultdict(list)
>>> for x in mylist:
...     key=x[0]
...     dic[key].append(x[-1])
...     
>>> [[k]+v for k,v in dic.items()]
[['item2', 'value3', 'value4'], ['item1', 'value1', 'value2']]
于 2013-05-02T23:02:26.010 に答える