0

重複の可能性:
Pythonのリストの(不規則な)リストをフラット化する

私はPythonのようなリストを持っています

l=[1,2,[3,4,5],[[4,2,4],[4,7,8]]]

セットを使用してすべての一意の値を取得したいのですが、これは失敗します

set(l)

TypeError: unhashable type: 'list'

誰か助けてくれませんか?リストなどのリストとセットを使いたいTHX

4

2 に答える 2

4

これをセットに入れる前に、ネストされた構造を「ほどく」またはフラットにする必要があります。そのためのジェネレーターを使用して、大きなリストに対してこれを効率的に保つことができます。

def flatten(lst):
    for element in lst:
        if isinstance(element, list):
            for subelement in flatten(element):
                yield subelement
        else:
            yield element

次に、リストでそのジェネレーターを使用しlてセットを作成します。

set(flatten(l))
于 2012-08-14T14:14:29.410 に答える
1

このアプローチはどうですか。セット操作を適用する前に、まずリストをフラット化します。

import collections

def flat_list(tlist):
   if isinstance(tlist, collections.Iterable):
      return [j for i in tlist for j in flat_list(i)]
   else:
      return [tlist]

それから:

myl=[1,2,[3,4,5],[[4,2,4],[4,7,8]]]

print set(flat_list(myl))

与えます:

set([1, 2, 3, 4, 5, 7, 8])

ジェネレーターを使用した @MartijnPieters アプローチは、このリスト内包表記ベースのアプローチよりも非常に大きなリストでより効率的に機能します。

于 2012-08-14T14:14:55.557 に答える