5

次のように、各値がリストである辞書があります。

dictA = {1:['a','b','c'],2:['d','e']}

残念ながら、この構造を変更して問題を回避することはできません

次のように、リストのすべてのエントリを 1 つのリストにまとめたいと考えています。

['a','b','c','d','e']

さらに、if ブロック内でこれを 1 回だけ実行したいと考えています。一度しかやりたくないので、中間変数に格納したくないので、当然、リスト内包表記が適しています。しかし、どのように?私の最初の推測では、

[dictA[key] for key in dictA.keys()]

収量、

[['a','b','c'],['d','e']]

これは機能しません

'a' in  [['a','b','c'],['d','e']]

利回りFalse。私が試した他のすべては、ある種の違法な構文を使用していました。

そのような理解をどのように行うことができますか?

4

5 に答える 5

10

返されたリストループします (辞書を直接ループすると、キーも得られます)。

[value for key in dictA for value in dictA[key]]

以上を直接使用dictA.itervalues():

[value for lst in dictA.itervalues() for value in lst]

リスト内包表記を使用すると、ループをネストできます。上記のループを、同じ順序でネストされているかのように読み取ります。

for lst in dictA.itervalues():
    for value in lst:
        # append value to the output list

または使用itertools.chain.from_iterable()

from itertools import chain

list(chain.from_iterable(dictA.itervalues()))

後者はシーケンスのシーケンスを取り、それらが 1 つの大きなリストであるかのようにそれらをループできます。dictA.itervalues()リストのシーケンスを提供し、chain()それらを組み合わせ list()て反復処理し、それらから 1 つの大きなリストを作成します。

すべての値のメンバーシップをテストするだけである場合、本当に必要なのは、すべての値をループして、一致する値が見つかるまで値をそれぞれに対してテストする簡単な方法です。このany()関数と適切なジェネレーター式を組み合わせることで、まさにそれが行われます。

any('a' in lst for lst in dictA.itervalues())

これはTrue、 のいずれかの値dictA'a'リストされるとすぐに戻り、早期にループを停止し.itervalues()ます。

于 2013-11-04T20:46:45.290 に答える
0

この特定のケースでは、ネストされた内包表記を使用できます。

[value for key in dictA.keys() for value in dictA[key]]

しかし、一般に、何かをネストされたリストに変換する方法をすでに理解している場合は、ネストされた iterable をchain.from_iterable次のようにフラット化できます。

itertools.chain.from_iterable(dictA[key] for key in dictA.keys())

これは、リストではなく反復子を返します。リストが必要な場合は、明示的に実行してください。

list(itertools.chain.from_iterable(dictA[key] for key in dictA.keys()))

補足として、for key in dictA.keys()は と同じことをfor key in dictA行いますが、古いバージョンの Python では、キーの追加リストを作成するために時間とメモリが浪費されます。ドキュメントにあるように、iteron adictは と同じiterkeysです。

したがって、上記のすべてのバージョンでは、in dictA代わりに を使用することをお勧めします。

于 2013-11-04T20:47:54.003 に答える
-1

あなたはいくつかのようなことができます..

output_list = []

[ output_list.extend(x) for x in {1:['a','b','c'],2:['d','e']}.values()]

output_list は ['a', 'b', 'c', 'd', 'e'] になります

于 2013-11-04T20:54:36.620 に答える