2

さまざまなタイプのサブリストを(とりわけ)含むリストがあるとします。

[1, 2, [3, 4], {5, 6}]

要素のタイプに応じて、選択的にフラット化したい(つまり、フラット化するだけsetsで、残りはフラット化しない):

[1, 2, [3, 4], 5, 6]

私の現在の解決策は関数ですが、私の知的好奇心のために、単一のリスト内包表記でそれを行うことが可能かどうか疑問に思います。

4

3 に答える 3

6

リスト内包表記は、フラット化用に設計されていません (複数の入力項目に対応する値を結合する方法がないため)。

ネストされたリスト内包表記でこれを回避できますが、これには最上位リストの各要素が反復可能である必要があります。

正直なところ、これには関数を使用するだけです。それが最もクリーンな方法です。

于 2012-10-26T17:08:37.507 に答える
4

このようなものには関数が望ましいというアンバーの意見はおそらく正しいでしょう。一方で、少しのバリエーションの余地は常にあります。入れ子の深さが 1 レベルを超えないことを前提としています。1 レベルを超える深さがある場合は、間違いなくこのための関数を優先する必要があります。しかし、そうでない場合、これは潜在的に実行可能なアプローチです。

>>> from itertools import chain
>>> from collections import Set
>>> list(chain.from_iterable(x if isinstance(x, Set) else (x,) for x in l))
[1, 2, [3, 4], 5, 6]

これを行う itertools 以外の方法には、ネストされたリスト内包表記が含まれます。これを 2 行に分割することをお勧めします。

>>> packaged = (x if isinstance(x, collections.Set) else (x,) for x in l)
>>> [x for y in packaged for x in y]
[1, 2, [3, 4], 5, 6]

これらのいずれかが単純な関数よりも速いか遅いかについて、私は強い直感を持っていません。これらは多くのシングルトン タプルを作成します (これは一種の無駄です)。しかし、それらは LC 速度でも発生し、通常はかなり優れています。

于 2012-10-26T17:15:37.460 に答える